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 часа роют и ни одной ошибки, спасибо всем за помощь

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

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;