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

Ищу наставника по стелсу(когото, кто как и я сидит в скайпе)

тут можно задать вопрос по скриптингу
Post Reply
Faifer
Neophyte
Neophyte
Posts: 12
Joined: 04.05.2012 19:53

Ищу наставника по стелсу(когото, кто как и я сидит в скайпе)

Post by Faifer »

Здравствуйте!

Ищу наставника по стелсу - человека, которому можно написать в скайп свои мелкие временные вопросики, пока я снова не научусь писать макросы сам.
Я играю в ультиму с 2001 года, с некоторыми перерывами. Раньше умел писать макросы на изи уо. В 2011-2012 был мой прошлый рецидив игры в УО - тогда я полюбил програму стелс, и писал множество макросов(в том числе на пвм) чем помню тогда особо гордился.
Но увы за несколько лет перерыва я подзабыл :lol: а старые макросы увы не сохранились чтобы по ним восстановить свою логику.

Сейчас снова играю на шарде http://www.forestwars.ru/ и учусь заново - проштудировал гайды по Паскалю и материалы для новичков на этом и другом форуме. Потихоньку понимание логики макросов становится на своё место))
Если с самыми простыми макросами уже проблем нету - то со средними - пока что немогу заставить делать их то, что хочу.
Last edited by Faifer on 22.02.2016 15:21, edited 1 time in total.
Faifer
Neophyte
Neophyte
Posts: 12
Joined: 04.05.2012 19:53

Re: Ищу наставника по стелсу(когото, кто как и я сидит в ска

Post by Faifer »

Итак сейчас я мучаю макрос с таким алгоритмом:

Code: Select all

шапка
1) пока живы то
2) юзнуть абилку(если есть 50 или больше маны) FOCUS
3) если стелс не 100 : входим в хайд, ходим туда-сюда
4) если стелс 100, а хайд меньше 100 – входим в хайд и снова в хайд
5) если стелс 100, хайд 100, а детект меньше 100 - юзать детект
6) если стелс и хайд и детект по 100 - юзать медитацию если маны меньше максимальной
7) если всё вкачал - то просто стоять в хайде, чтобы те, кто отстают могли вкачать детект(ну или просто спрятаться и стоять в хайде)
И вот собственно сам макрос:

Code: Select all

Program Detect_Meditation_Ability_Hide_Stealth;
{$Include 'checksave.inc'}

procedure Medit;
begin
 CheckSave;
 if (WarMode = True) then SetWarMode(False);
 if (Mana < MaxMana) then
 begin
	UseSkill('Meditation');
	repeat
		wait(3500);
	until (Mana = MaxMana);
	end;
 wait (100);
end;


procedure Abil;

var abtime:TdateTime;

begin
 CheckSave;
 if (Mana >= 50) then
 begin
	if (InJournalBetweenTimes('истекло',abtime,now)>0) or ((DateTimeToUnix(now)-DateTimeToUnix(abtime))>60) then
	begin
		UOSay('.useability 1');
		ClearJournal;
		abtime:=now;
	end;
 end;
end;

procedure Stels;
begin
 CheckSave;
 repeat
	UseSkill('Hiding');
	wait (4400);
 until (Hidden = True);
 wait (100);
 repeat
	NewMoveXY(GetX(Self), GetY(Self) + 1,False,0,False);
	wait (100);
	NewMoveXY(GetX(Self), GetY(Self) -1,False,0,False);
	wait (100);
 until (Hidden = False);
end;

procedure Hide;
begin
 CheckSave;
 repeat
	UseSkill('Hiding');
	wait (4400);
 until (Hidden = True);
end;

procedure Detect;
begin
 CheckSave;
 UseSkill('Detecting Hidden');
 wait (3400);
end;

BEGIN
SetARStatus(True);
SetPauseScriptOnDisconnectStatus(True);
SetWarMode(False);
while (Dead = False) do 
begin
	CheckSave;
	if ((GetSkillValue('Focus') < 100) or (GetSkillValue('Meditation') < 100)) then Abil;
	wait (100);
	if (GetSkillValue('Stealth') < 100) then Stels;
	wait (100);
	if ((GetSkillValue('Stealth') = 100) and (GetSkillValue('Hiding') < 100)) then Hide;
	wait (100);
	if ((GetSkillValue('Stealth') = 100) and (GetSkillValue('Hiding') = 100) and (GetSkillValue('Detecting Hidden') < 100)) then Detect;
	wait (100);
	if ((GetSkillValue('Stealth') = 100) and (GetSkillValue('Hiding') = 100) and (GetSkillValue('Detecting Hidden') = 100) and (GetSkillValue('Meditation') < 100)) then Medit;
	wait (100);
	if ((GetSkillValue('Focus') = 100) and (GetSkillValue('Meditation') = 100)) then Hide;
	wait (100);
 end;
END.
Макрос заработал, но делает немного не то, что я хочу. Я запускаю сразу 10-20 мультов(так как иначе на сервере Форест Варс детект не прокачать) - но:
1) персы пытаются юзать абилку постоянно до тех пор пока маны не начинает быть меньше 50, хотя время действия еще не прошло(
2) хайдящиеся чары неуспевают даже 1 шага ступить в хайде, чтобы качнуть стелс - или с задержками какаято лажа или они слишком засинхроненые и детектят в те 0.1 секунды когда надо начинать движение.
3) есть подозрение что я всё-таки неправильно расписал логику скрипта и я не достигну желаемого результата(быстрая вкачка хайда\стелса\детекта\абилки без потерь времени)

Прошу знающих людей помочь либо дать(можно в приват) свой скайп, где я мог бы задавать свои маленькие вопросики =))
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Ищу наставника по стелсу(когото, кто как и я сидит в ска

Post by drabadan »

аська в профиле указана, чем смогу...
Faifer
Neophyte
Neophyte
Posts: 12
Joined: 04.05.2012 19:53

Re: Ищу наставника по стелсу(когото, кто как и я сидит в ска

Post by Faifer »

Слегка изменил скрипт

Code: Select all

Program Detect_Meditation_Ability_Hide_Stealth; //v1.5
{$Include 'checksave.inc'}

procedure Medit;
begin
 CheckSave;
 if (WarMode = True) then SetWarMode(False);
 if (Mana < MaxMana) then
 begin
	UseSkill('Meditation');
	repeat
		wait(3500);
	until (Mana = MaxMana);
	end;
 wait (100);
end;


procedure Abil;

var abtime:TdateTime;

begin
 CheckSave;
 if (Mana >= 50) then
 begin
	if (InJournalBetweenTimes('истекло',abtime,now)>0) or ((DateTimeToUnix(now)-DateTimeToUnix(abtime))>60) then
	begin
		UOSay('.useability 1');
		abtime:=now;
	end;
 end;
end;

procedure Stels;
begin
 CheckSave;
 repeat
	UseSkill('Hiding');
	wait (4400);
 until (Hidden = True);
 wait (100);
 repeat
	NewMoveXY(GetX(Self), GetY(Self) + 1,False,0,False);
	wait (100);
	NewMoveXY(GetX(Self), GetY(Self) -1,False,0,False);
	wait (100);
 until (Hidden = False);
end;

procedure Hide;
begin
 CheckSave;
 repeat
	UseSkill('Hiding');
	wait (4400);
 until (Hidden = True);
end;

procedure Detect;
begin
 CheckSave;
 UseSkill('Detecting Hidden');
 wait (3400);
end;

BEGIN
SetARStatus(True);
SetPauseScriptOnDisconnectStatus(True);
SetWarMode(False);
while (Dead = False) do 
begin
	CheckSave;
	if ((GetSkillValue('Focus') < 100) or (GetSkillValue('Meditation') < 100)) then Abil;
	wait (100);
	if (GetSkillValue('Stealth') < 100) then Stels;
	wait (100);
	if (GetSkillValue('Hiding') < 100) then Hide;
	wait (100);
	if (GetSkillValue('Detecting Hidden') < 100) then Detect;
	wait (100);
	if (GetSkillValue('Meditation') < 100) then Medit;
	wait (100);
	if ((GetSkillValue('Focus') = 100) and (GetSkillValue('Meditation') = 100)) then Hide;
	wait (100);
 end;
END.
Но оно всеравно досихпор не делает что хочу на все 100%.... Я подумал что раз куча чаров с разными скилами чтобы не стояли без дела - пусть юзают скилы по очереди - абил, стелс, хайд, детект, медит.
Но те чары которые качали хайд - продолжают его качать с абилкой и медитацией, а вот детект не юзают. Да и стелс - ни один чар ни на 0.1 не прокачал =(
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Ищу наставника по стелсу(когото, кто как и я сидит в ска

Post by drabadan »

а почему бы не подумать и не перепроектировать "вот это вот все..." Скажем, ты можешь написать функцию в которой определить план прокачки, хайд - стелс - детект ... в зависимости от тех скиллов которые есть на чаре. Провести 1 раз инициализацию этой очереди и юзать тот скил который стоит сейчас в очереди. Переопредели большинство своих процедур в функции ибо их механика, по моему мнению больше подходит функции, подумай о рекурсии в функциях типа медитации. Подключи ивенты для обработки событий журнала или бафов, создай структуру в которой храни пул флагов для важных дел, опиши функцию для обработки этих флагов. Обильно снабди код системными сообщениями, старайся любое действие представлять как булеву величину, выполнилось или нет, раньше ты ведь не можешь знать выполнится оно или нет, значит нужно проверить, а выполняется ли, корректно ли...
Переопредели немного скрипт, какой простой бы он ни был, напиши себе темплейт для работы и дальше все пойдет как по накатанной.
Faifer
Neophyte
Neophyte
Posts: 12
Joined: 04.05.2012 19:53

Re: Ищу наставника по стелсу(когото, кто как и я сидит в ска

Post by Faifer »

Извини, но ты использовал некоторые термины, которые я не понимаю =))) Аськи у меня к сожалению нету - но это покачто))) Если бы в скайпе поспрашивать по порядку - мб мне стало бы понятнее))

Насчет булевой я еще понял - да действительно будет нагляднее если я заполоню скрипт системными сообщениями и буду видеть какой шаг он проходит, а какой нет. Попробую этот совет для начала.

Насчет очередей - я покачто недоконца понимаю как работать с массивами и переборками - потому боюсь несмогу составить логику скрипта.

Почему функции? Как представить юз скил детект или юз скил хайд в виде функции? Просто заменить procedure Detect; на function Detect(DetectUse:Boolean); и потом обьявлять как Detect(True); ?

Что такое рекурсия в конексте написания скриптов на стелс? (я почитал вики и даже почитал что такое рекурсия в программировании, но неочень понял как она должна выглядеть в скрипте).. Можно хоть один пример?

Ивенты для обработки событий журнала или бафов - это та проверка на сообщение в журнале? Она посути актуальна лишь для абилки - в других случаях можно либо обойтись другими проверками, либо они вообще ненужны там - разве нет?

Создай структуру в которой храни пул флагов - вот это я вообще непонял.

Темплейт судя по словарю - шаблон. Грубо говоря я и пытаюсь вывести шаблон для всех моих будущих скриптов - которые будут преследовать 2 цели - основную и побочную(в данный момент это прокачка абилки паралельно с качкой лоров). Дальше это будет прокачка абилки с варами.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Ищу наставника по стелсу(когото, кто как и я сидит в ска

Post by Vizit0r »

Как представить юз скил детект или юз скил хайд в виде функции?
function Detect :Boolean;
begin
....
if XXX then
Result := True
else
Result := False;



if Detect then... // оно же if Detect = True

причем тут рекурсия я тоже не очень понял.
структуру в которой храни пул флагов для важных дел
type
XXX = record
HideState,
StealthState,
....
ZZZState : Boolean;
end;

обращаться например через
if xxx.HideState then
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Ищу наставника по стелсу(когото, кто как и я сидит в ска

Post by drabadan »

Не дописанная функция рекола с рекурсией.

Code: Select all

function Recall(Where: Cardinal) : Boolean;
var
 selfPos : TPoint;
 i : Integer;
begin
 Result := False;
 selfPos.X := GetX(Self);
 selfPos.Y := GetY(Self);
 
 if not (Mana > MaxMana/3) then begin
  UseSkill('Meditation');
  for i := 0 to 300 do
   if (Mana > MaxMana/3) then
    break;            
 end;
 
 if not CheckRegs then 
  GetRecallRegs(ObjAtLayer(BankLayer));
   
 Cast('Recall');
 if WaitForTarget(5000) then
  TargetToObject(Where)
 else
  AddToSystemJournal('Error, targeting rune!');
 CancelTarget;
                       
 for i := 0 to 100 do           
  if InverseCheckSelfPositionWith(selfPos.X, selfPos.Y) then begin
   Result := True;
   AddToSystemJournal('Recall successfull!');
   break;
  end
  else
   Wait(100);
   
 if not Result and TriesCount < 5 then begin//TriesCount глобальный флаг для подсчета попыток. Перед вызовом обязательно его занулить.
   Inc(TriesCount);  
   Recall(Where); //если не достигли результата тру при выполнении, запускаем заново.
  end
 else
  AddToSystemJournal('Something globally wrong, reached TriesCount <  5!');
end;

procedure GoHome();
begin
 TriesCount := 0;
 if Recall(HomeRune) then
  AddToSystemJournal('Ура все получилось');
end;

Глобальный пул флагов, это если есть необходимость юзать больше 1-2 условных трайскаунтов. Тогда их лучше организовывать в структуры. К твоему скрипту применительно 1 трайскаунт на использование скилла, если скажем 100 юзов не дали прироста то вайнить в журнал - всем капец скрипт не работает, как дальше жить... Ну или переход на след скилл, с месседжем, что "вот это вот все" не сработало и будем пробовать дальше.

Честно говоря, каждый пишет под свой стиль, кто то может написать скрипт, поставить чаров и 2 недели не проверять с уверенностью, что там все агонь. А кому то хватит банальщины без всяких наворотов типа вайл тру ду и бб гл хф. Если нравится присматривать за ботами и нет нужды в погоне за 99.9% аптаймом и эффективностью то пиши в свое удовольствие, не морочься.
Post Reply