Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Мувер

тут можно задать вопрос по скриптингу
Post Reply
NoSilence
Novice
Novice
Posts: 94
Joined: 02.01.2010 13:55

Мувер

Post by NoSilence »

Как стандартный мувер определяет, что перед ним дверь? Ищет, если не удалось шагнуть? Можно ли вообще увидеть код мувера (new который)? :)
Last edited by NoSilence on 04.09.2015 4:11, edited 1 time in total.
///
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Мувер

Post 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;

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

там код так переплетен, что надо будет половину стелса выкладывать)))
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
NoSilence
Novice
Novice
Posts: 94
Joined: 02.01.2010 13:55

Re: Мувер

Post by NoSilence »

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

Чет OpenDoor как процедура числится :)
function StepQ(Direction : Byte; Running : Boolean) : Integer
256 - Была предпринята попытка открыть дверь, и чар развернулся в нужном направлении.
Что это означает?
///
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Мувер

Post 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;
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
NoSilence
Novice
Novice
Posts: 94
Joined: 02.01.2010 13:55

Re: Мувер

Post 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;
///
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Мувер

Post by Vizit0r »

OpenDoor это серверный макрос - стелс шлет пакет на сервер, а тот уже пробует открыть дверь, результат стелсу не возвращается.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
NoSilence
Novice
Novice
Posts: 94
Joined: 02.01.2010 13:55

Re: Мувер

Post by NoSilence »

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

Есть ли какой-нибудь еще способ вычислить, что персонаж закончил движение, не сравнивая (GetX(Self) = PredictedX) and (GetY ...?
///
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Мувер

Post by Vizit0r »

со stepq все сложно - они шлются пачкой, без ождиания ответа на предыдущие.
нет.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
NoSilence
Novice
Novice
Posts: 94
Joined: 02.01.2010 13:55

Re: Мувер

Post by NoSilence »

Vizit0r wrote:со stepq все сложно - они шлются пачкой, без ождиания ответа на предыдущие.
нет.
Ага, но мувер я уже передал на StepQ. Быстрее ведь и сам вопрос с дверями решает :) Я думал, если слать не по таймеру спидхак получится в случае отсутствия как-либо проверок на сервере.
///
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Мувер

Post by Vizit0r »

по таймеру конечно. только без ожидания ответа на предыдущий шаг.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply