Page 1 of 1

Мувер

Posted: 03.09.2015 22:00
by NoSilence
Как стандартный мувер определяет, что перед ним дверь? Ищет, если не удалось шагнуть? Можно ли вообще увидеть код мувера (new который)? :)

Re: Мувер

Posted: 03.09.2015 23:20
by Vizit0r
if (tsfDoor in FlagSet) and (TCharacter(fCharObj).Dead or OpenDoor) then
begin
if (not TCharacter(fCharObj).Dead) and OpenDoor then
BlockingItem.DoorID := ObjectInfo^._ID;
end;

по флагу определяет.

там код так переплетен, что надо будет половину стелса выкладывать)))

Re: Мувер

Posted: 04.09.2015 3:14
by NoSilence
Vizit0r wrote:по флагу определяет.
Флаг, как я понял, дает какой-нибудь аналог IsWorldCellPassable?

Чет OpenDoor как процедура числится :)
function StepQ(Direction : Byte; Running : Boolean) : Integer
256 - Была предпринята попытка открыть дверь, и чар развернулся в нужном направлении.
Что это означает?

Re: Мувер

Posted: 04.09.2015 10:31
by Vizit0r
Флаг, как я понял, дает какой-нибудь аналог IsWorldCellPassable?
GetTileFlags, ConvertIntegerToFlags etc

Чет OpenDoor как процедура числится :)
потому что это скриптовая функция. А кусок, что я тебе скинул - из потрохов стелса, где OpenDoor - булевый параметр той процедуры, где проверяется проходимость точки.
Что это означает?

Code: Select all

    //  если после трёх попыток дверь осталась на месте, считаем что она залочена.
    if (SinDoorID <> $0) and (i >= 3) then
    begin
      MoverMessage('It seems door is locked.');
      Script_SetBadLocation(ToX, ToY);
      Exit(-2); // нельзя пройти
    end;

Re: Мувер

Posted: 04.09.2015 13:28
by NoSilence
Все равно OpenDoor мог бы возвращать true, если была предпринята попытка открыть дверь. Зачем это? Если чар встал, но двери перед ним нет, нужно же выполнять другие проверки на проходимость. А как я узнаю, что дверь действительно была виновником? Делать еще один шаг после OpenDoor?

Пока что я сделал так:

Code: Select all

		case Step(Dir, Stam > 5) of
			1: sync;
			5: begin
				if (not Dead) and FindDoor(MovePoints[i].X, MovePoints[i].Y) then begin
					OpenDoor;
					sync;
					continue;
				end;
				if OnCantStep <> nil then
					if OnCantStep() then continue;
				SetBadLocation(MovePoints[i].X, MovePoints[i].Y);
				break;
			end;
			7: if OnStep <> nil then
				if not OnStep() then exit;
		else
			break;
		end;
Где FindDoor:

Code: Select all

function FindDoor(X, Y: integer):boolean;
var
	t: word;
begin
while FindAtCoord(X, Y) > 0 do begin
	t:= GetType(FindItem);
	if (t >= $0675) and (t <= $06F6) then begin
		result:= true;
		exit;
	end;
	Ignore(FindItem);
end;
end;

Re: Мувер

Posted: 04.09.2015 14:54
by Vizit0r
OpenDoor это серверный макрос - стелс шлет пакет на сервер, а тот уже пробует открыть дверь, результат стелсу не возвращается.

Re: Мувер

Posted: 05.09.2015 15:57
by NoSilence
Допустим, я забиваю очередь шагов StepQ. Как они отсылаются на сервер? По некому таймеру?

Есть ли какой-нибудь еще способ вычислить, что персонаж закончил движение, не сравнивая (GetX(Self) = PredictedX) and (GetY ...?

Re: Мувер

Posted: 05.09.2015 17:39
by Vizit0r
со stepq все сложно - они шлются пачкой, без ождиания ответа на предыдущие.
нет.

Re: Мувер

Posted: 05.09.2015 18:16
by NoSilence
Vizit0r wrote:со stepq все сложно - они шлются пачкой, без ождиания ответа на предыдущие.
нет.
Ага, но мувер я уже передал на StepQ. Быстрее ведь и сам вопрос с дверями решает :) Я думал, если слать не по таймеру спидхак получится в случае отсутствия как-либо проверок на сервере.

Re: Мувер

Posted: 05.09.2015 21:20
by Vizit0r
по таймеру конечно. только без ожидания ответа на предыдущий шаг.