Page 1 of 1

Обход препятствия в виде руды (Ore)

Posted: 05.11.2009 2:27
by darkday
На нашем сервере руда не является препятствием, через нее свободно можно ходить, но при попытке стать на клетку с рудой или в случае заграждения пути кусками руды, стелс клиент пишет Point Not Passable или что типа того, вообщем проще говоря упирается в руду и категорически не хочет через нее идти. Подскажите пожалуйста как можно решить эту проблему.

Posted: 05.11.2009 18:39
by grundick
Что за сервер?

Posted: 05.11.2009 21:41
by darkday

Posted: 06.11.2009 11:58
by Vizit0r
'uo mul-files' - put' k pravilnomu uo-katalogu ukazan (esli ix bolshe odnoi) ?

Posted: 06.11.2009 14:21
by darkday
Vizit0r wrote:'uo mul-files' - put' k pravilnomu uo-katalogu ukazan (esli ix bolshe odnoi) ?
Да указан именно к той UO с которой я играю на этом шарде.
Может у меня ходилка какая то кривая? потому как она очень часто ругается Point Not Passable, когда упирается в скалу одноклеточную в шахте или в другого персонажа

Code: Select all

   procedure MoveXY(x,y,prec : integer; runflag : boolean);
   // x,y - координаты, в которые идем
   // prec - точность подхода
   // runflag - бежать или идти
   // v. 1.04 (с) Edred, скрипт портирован с инжекта
   // оригинальная версия Yoko с доработкой AGRS и Edred.
   var ld, ldc, dx, dy, mx, my : Integer;
   begin
      ld := 0; ldc := 0;
      while true do
      begin
//         addtosystemjournal('Идем в: ' + inttostr(x) + ', ' + inttostr(y));
//         addtosystemjournal('Счас в: ' + inttostr(GetX(self)) + ', ' + inttostr(GetY(self)));
         dx := GetX(self) - x; if dx < 0 then dx := 0 - dx;
         dy := GetY(self) - y; if dy < 0 then dy := 0 - dy;
         if dy > dx then dx := dy;
         if dx <= prec then exit;
         mx := GetX(self); my := GetY(self);
         dx := mx - x; if dx < 0 then dx := 0 - dx;
         dy := my - y; if dy < 0 then dy := 0 - dy;
         if dy > dx then dx := dy;
         if dx <= prec then exit;
         if ld = dx then begin
            ldc := ldc + 1;
            if ldc > 100 then begin addtosystemjournal( 'MoveXY: Cannot reach location!' ); 
      Raw_Move(3,false);
      Raw_Move(3,false);
exit; 
end;
         end
         else ld := dx;
         waitconnection(5000);
//         addtosystemjournal('Отладка: перед шагом: myx, myy = ' + inttostr(mx) + ', ' + inttostr(my) + ' [MoveXY]');
         if mx = x then begin
            if my = y then exit;
            // North
            if my > y then begin Raw_Move(0,runflag); continue; end;
            // South
            Raw_Move(4,runflag); continue;
         end;
         if mx < x then begin
            // Northeast
            if my > y then begin Raw_Move(1,runflag); continue; end;
            // East
            if my = y then begin Raw_Move(2,runflag); continue; end;
            // Southeast
            Raw_Move(3,runflag); continue;
         end;
         // Southwest
         if my < y then begin Raw_Move(5,runflag); continue; end;
         // West
         if my = y then begin Raw_Move(6,runflag); continue; end;
         // Nortwest
         Raw_Move(7,runflag); continue;
      end;
   end;


Posted: 06.11.2009 14:47
by WladL
Блин, непойму зачем использовать "слепую" ходилку, когда есть классная встроенная ходилка, которая "видит" статику и не тыкается в нее?
убери эту старую ходилку и работай со встроенной.
http://stealth.od.ua/forum/viewtopic.php?t=1245

Posted: 06.11.2009 21:49
by darkday
вроде как полегчало с новой ходилкой, 2 часа роют и ни одной ошибки, спасибо всем за помощь :wink:

Posted: 07.11.2009 0:16
by grundick
Проблемы это не решает. Если стелс кричит ,что точка не доступна, значит беда...

Posted: 08.11.2009 23:34
by darkday
grundick wrote:Проблемы это не решает. Если стелс кричит ,что точка не доступна, значит беда...
с новой ходилкой не кричит, а со старой он ничего обходить не хотел, стоило ему на пути скинуть сундук или кусок руды тут же Point not passable

Теперь осталось его заставить видеть гейты и не заходить в них :D

Posted: 08.11.2009 23:50
by WladL
В том же топике есть ходилки основанные на новой, зовутся MoveInHide и easyMoveXY

у MoveInHide есть готовый массив BadObj просто добавь туда типы гейтов и замени условие на более подходящее.
// если стамины меньше чем дексы, устанавливаем хумов и элемов в bad objects
Либо в easyMoveXY в основном теле функции...

Code: Select all

If Not IsWorldCellPassable(getX(self),getY(self),mPathArr[i].X,mPathArr[i].Y,WorldNum,getZ(self)) then  Break;
  If Что_нить_типа_FindGate then SetBadLocation(mPathArr[i].X,mPathArr[i].Y);<====вот типа проверка на гейт (Что_нить_типа_FindGate сам нарисуешь надеюсь)
      If Not MoveToPoint(mPathArr[i].X,mPathArr[i].Y,Running) then  Break;