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

Получение Durability, через ToolTip.

тут можно задать вопрос по скриптингу
Post Reply
ILTB
Neophyte
Neophyte
Posts: 12
Joined: 20.12.2016 13:37

Получение Durability, через ToolTip.

Post by ILTB »

Добрый день!

Прошу помощи со следующим скриптом:

Code: Select all

Program CheckDurability;

var
	Armor_Item_Layers : Array [0..6] of Word;
	
	aa : TClilocRec;
	
procedure Init_Armor_Layers;
begin
	Armor_Item_Layers[0] := HatLayer;    //
	Armor_Item_Layers[1] := NeckLayer;   //
	Armor_Item_Layers[2] := ArmsLayer;   //
	Armor_Item_Layers[3] := TorsoLayer;  //
	Armor_Item_Layers[4] := PantsLayer;  //
	Armor_Item_Layers[5] := GlovesLayer; //
	Armor_Item_Layers[6] := LhandLayer;  //
end;

procedure Check_Armor_Durability;
var
	l : Integer;
begin
	for l:= 0 to 6 do begin
		aa := GetToolTipRec(ObjAtLayer(Armor_Item_Layers[l]));
		AddToSystemJournal('Name: ' + aa.Items[0].Params[0]);
		AddToSystemJournal(aa.Items[3].Params[0]);
	end;
end;	

procedure Check_Weapon_Durability;
var
	String_Durability : String;
	String_HP_Durability : String;
begin
		aa := GetToolTipRec(ObjAtLayer(RhandLayer));
		AddToSystemJournal('Name: ' + aa.Items[0].Params[0]);
		AddToSystemJournal(aa.Items[4].Params[0]);
		String_Durability := aa.Items[4].Params[0];
		String_HP_Durability := Copy(String_Durability,13,2);
		AddToSystemJournal(String_HP_Durability);
end;

begin
	//Init_Armor_Layers;
	//Check_Armor_Durability;
	Check_Weapon_Durability;
end.
Проблема вся в том, что я не могу корректно обрезать через Copy получаемые значения 'Прочность: 10/10', если значение прочности падает, то выводится '8/'. Как можно обойти это?
По сути нужно, чтобы переменные выводили: Текущая прочность и Максимальная прочность.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Получение Durability, через ToolTip.

Post by drabadan »

Code: Select all

Program New;
var
 str, value1, value2 : String;
begin
 str := 'Durability: 8/10';
value1 := Copy(str, Pos(':', str) + 2, (Length(str) - Pos(':', str)) - (Length(str) - Pos('/', str)) - 2);
value2 := Copy(str, Pos('/', str) + 1, Length(str) -1);
AddToSystemJournal('Value1 = ' + value1 + ' Value2 = ' + value2);

str := 'Durability: 10/10';
value1 := Copy(str, Pos(':', str) + 2, (Length(str) - Pos(':', str)) - (Length(str) - Pos('/', str)) - 2);
value2 := Copy(str, Pos('/', str) + 1, Length(str) -1);
AddToSystemJournal('Value1 = ' + value1 + ' Value2 = ' + value2);

 str := 'Durability: 6/8';
value1 := Copy(str, Pos(':', str) + 2, (Length(str) - Pos(':', str)) - (Length(str) - Pos('/', str)) - 2);
value2 := Copy(str, Pos('/', str) + 1, Length(str) -1);
AddToSystemJournal('Value1 = ' + value1 + ' Value2 = ' + value2);
end.
Output:

Code: Select all

12:54:08:855 [AlexandrHeartwoodInceptum]: Compiling
12:54:08:974 [AlexandrHeartwoodInceptum]: Compiled succesfully
12:54:08:976 [AlexandrHeartwoodInceptum]: Value1 = 8 Value2 = 10
12:54:08:978 [AlexandrHeartwoodInceptum]: Value1 = 10 Value2 = 10
12:54:08:980 [AlexandrHeartwoodInceptum]: Value1 = 6 Value2 = 8
12:54:08:984 [AlexandrHeartwoodInceptum]: Succesfully executed
12:54:08:987 [AlexandrHeartwoodInceptum]: Script testShit1.sc stopped successfuly

Code: Select all

Program New;
                                          
type
 TDurability = record
  Current, Max : Integer;
 end;

                                          
function GetDurability(Item : Cardinal) : TDurability;
var
  toolTip : String;
begin
  toolTip := GetToolTip(Item);
  
  if (Pos('Durability', toolTip) <= 0) then
    begin                                  
      AddToSystemJournal('Tooltip is broken');
      Exit;
    end;   
    
  Result.Current := StrToInt(Copy(str, Pos(':', str) + 2, (Length(str) - Pos(':', str)) - (Length(str) - Pos('/', str)) - 2)); 
  Result.Max := StrToInt(value2 := Copy(str, Pos('/', str) + 1, Length(str) -1));
end;



var
 str, value1, value2 : String; 
begin
 str := 'Durability: 8/10';
value1 := Copy(str, Pos(':', str) + 2, (Length(str) - Pos(':', str)) - (Length(str) - Pos('/', str)) - 2);
value2 := Copy(str, Pos('/', str) + 1, Length(str) -1);
AddToSystemJournal('Value1 = ' + value1 + ' Value2 = ' + value2);

str := 'Durability: 10/10';
value1 := Copy(str, Pos(':', str) + 2, (Length(str) - Pos(':', str)) - (Length(str) - Pos('/', str)) - 2);
value2 := Copy(str, Pos('/', str) + 1, Length(str) -1);
AddToSystemJournal('Value1 = ' + value1 + ' Value2 = ' + value2);

 str := 'Durability: 6/8';
value1 := Copy(str, Pos(':', str) + 2, (Length(str) - Pos(':', str)) - (Length(str) - Pos('/', str)) - 2);
value2 := Copy(str, Pos('/', str) + 1, Length(str) -1);
AddToSystemJournal('Value1 = ' + value1 + ' Value2 = ' + value2);


end.
ILTB
Neophyte
Neophyte
Posts: 12
Joined: 20.12.2016 13:37

Re: Получение Durability, через ToolTip.

Post by ILTB »

Спасибо, все получилось!
ILTB
Neophyte
Neophyte
Posts: 12
Joined: 20.12.2016 13:37

Re: Получение Durability, через ToolTip.

Post by ILTB »

Совсем забыл спросить: Какое количество результатов может выводить функция?
Например, если я захочу добавить в функцию помимо Result.Current(Integer) и Result.Max(Integer), еще Result.ItemName(String)?
А то у меня получается, что первый раз выводит все правильно, после Result.ItemName(String) выводит абракадабку и крашится :(
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Получение Durability, через ToolTip.

Post by drabadan »

ILTB wrote:Совсем забыл спросить: Какое количество результатов может выводить функция?
Например, если я захочу добавить в функцию помимо Result.Current(Integer) и Result.Max(Integer), еще Result.ItemName(String)?
А то у меня получается, что первый раз выводит все правильно, после Result.ItemName(String) выводит абракадабку и крашится :(

Code: Select all


//объект содержащий в себе необходимые тебе поля
type
 TDurability = record
  //добавляем в объект новое поле
  ItemName : String;
  Current, Max : Integer;
 end;

//интерфейс функции, в котором содержится имя, аргументы и тип возвращаемого функцией объекта                                          
function GetDurability(Item : Cardinal) : TDurability;
если у тебя в объекте не содержится поля ItemName то каким боком ты его можешь себе вернуть, а тем более присвоить ему значение.
ILTB
Neophyte
Neophyte
Posts: 12
Joined: 20.12.2016 13:37

Re: Получение Durability, через ToolTip.

Post by ILTB »

Ненене в том-то и дело, что я его объявляю, и первый раз он выводит верное имя, но вот если я повторяю запуск скрипта он начинает писать абракадабку.
+ Ко всему зависает сам клиент и Stealth.

Code: Select all

Program FunctionsCheckDurability;

type                                      
	TDurability = Record
		R_H_L_ItemName : String;
		R_H_L_D_Current, R_H_L_D_Max : Integer;
		L_H_L_D_Current, L_H_L_D_Max : Integer;
	end;

var
	t : TClilocRec;
	String_Durability : String;
	
	R_H_L_D : TDurability;
	L_H_L_D : TDurability;

function Get_R_H_L_Durability : TDurability;
begin
	t := GetToolTipRec(ObjAtLayer(RhandLayer));
	String_Durability := t.Items[4].Params[0];
	Result.R_H_L_ItemName := t.Items[0].Params[0];
	Result.R_H_L_D_Current := StrToInt(Copy(String_Durability, Pos(':', String_Durability) + 2, (Length(String_Durability) - Pos(':', String_Durability)) - (Length(String_Durability) - Pos('/', String_Durability)) - 2));
	Result.R_H_L_D_Max := StrToInt(Copy(String_Durability, Pos('/', String_Durability) + 1, Length(String_Durability) -1));
end;

function Get_L_H_L_Durability : TDurability;
begin
	t := GetToolTipRec(ObjAtLayer(LhandLayer));
	String_Durability := t.Items[3].Params[0];
	Result.L_H_L_D_Current := StrToInt(Copy(String_Durability, Pos(':', String_Durability) + 2, (Length(String_Durability) - Pos(':', String_Durability)) - (Length(String_Durability) - Pos('/', String_Durability)) - 2));
	Result.L_H_L_D_Max := StrToInt(Copy(String_Durability, Pos('/', String_Durability) + 1, Length(String_Durability) -1));
end;

begin
	R_H_L_D := Get_R_H_L_Durability;
	AddToSystemJournal('Name: ' + R_H_L_D.R_H_L_ItemName + ', ' + 'Durability: ' + IntToStr(R_H_L_D.R_H_L_D_Current) + '/' + IntToStr(R_H_L_D.R_H_L_D_Max));
	L_H_L_D := Get_L_H_L_Durability;
	AddToSystemJournal(IntToStr(L_H_L_D.L_H_L_D_Current) + '/' + IntToStr(L_H_L_D.L_H_L_D_Max));
end.
Первый запуск:

Code: Select all

19:53:45:001 [Ololo]: Compiling
19:53:45:093 [Ololo]: Compiled succesfully
19:53:45:093 [Ololo]: Name: Copper Katana, Durability: 25/25
19:53:45:093 [Ololo]: 14/25
19:53:45:093 [Ololo]: Succesfully executed
19:53:45:093 [Ololo]: Script FunctionsCheckDurability.sc stopped successfuly
Второй запуск:

Code: Select all

19:53:46:715 [Ololo]: Compiling
19:53:46:809 [Ololo]: Compiled succesfully
19:53:46:810 [Ololo]: Name: SetJournalLine, Durability: 25/25
19:53:46:810 [Ololo]: 14/25
19:53:46:810 [Ololo]: Succesfully executed
19:53:46:810 [Ololo]: Script FunctionsCheckDurability.sc stopped successfuly
Третий запуск:

Code: Select all

19:57:55:124 [Ololo]: Compiling
19:57:55:214 [Ololo]: Compiled succesfully
19:57:55:215 [Ololo]: Name: &op_Equality, Durability: 25/25
19:57:55:217 [Ololo]: 14/25
19:57:55:219 [Ololo]: Succesfully executed
19:57:55:220 [Ololo]: Script FunctionsCheckDurability.sc stopped successfuly

drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Получение Durability, через ToolTip.

Post by drabadan »

а хз, что там с тултипреком. Юзай GetTooltip(ItemId : Cardinal) : String; и не люби себе мозги.
ILTB
Neophyte
Neophyte
Posts: 12
Joined: 20.12.2016 13:37

Re: Получение Durability, через ToolTip.

Post by ILTB »

Мужики выручайте, совсем голова не варит.
Как вычленить все, что находится между знаками ' | ' и записать построчно, в строке (Или между конкретных знаков): Параметр | Параметр | Параметр | Параметр | Параметр
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Получение Durability, через ToolTip.

Post by drabadan »

ILTB wrote:Мужики выручайте, совсем голова не варит.
Как вычленить все, что находится между знаками ' | ' и записать построчно, в строке (Или между конкретных знаков): Параметр | Параметр | Параметр | Параметр | Параметр
http://www.delphibasics.ru/TStringList.php

Code: Select all

Program New;

procedure TestSLGetValuesFromString(Delimiter, SourceString : String);
var
 SL : TStringList;           
 i : Integer;
begin
 try 
   SL := TStringList.Create;
   SL.Delimiter := Delimiter;
   
   SL.DelimitedText := SourceString;
   
   for i := 0 to SL.Count-1 do
    AddToSystemJournal(SL[i]);
    
 finally
   SL.Free;
 end;
end; 


begin
 //Body of Script                                       
 AddToSystemJournal('Test1');
 TestSLGetValuesFromString('|', 'Value1|Value2|Value3');
 AddToSystemJournal('Test2');    
 TestSLGetValuesFromString(';', 'Value1;Value2;Value3');
end.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Получение Durability, через ToolTip.

Post by Vizit0r »

ILTB

какой нажористый скрипт, я на нем уже третий баг ловлю, а до основного еще и не дошел даже :)
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Получение Durability, через ToolTip.

Post by Vizit0r »

нашел и исправил штук 5 багов, включая этот глобальный со строками.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
ILTB
Neophyte
Neophyte
Posts: 12
Joined: 20.12.2016 13:37

Re: Получение Durability, через ToolTip.

Post by ILTB »

drabadan
Спасибо, все сделал. Осталось только разобраться, как все это дело прикрутить, чтобы была возможность с одного надетого предмета выдергивать тот или иной параметр по надобности.

Vizit0r
Прошу прощения, скриптер и кодер из меня так себе. Пробую и пытаюсь. Скажем так, это чисто для души :)
Могу я у Вас узнать как это все дело оптимизировать и куда вообще копать?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Получение Durability, через ToolTip.

Post by Vizit0r »

ILTB
я сейчас пытаюсь решить вопросы со строками в паксе.
Пока получается или отличная беспроблемная работа, но с вагоном утечек - или глючная работа со строками, зато без утечек.
Что так хреново, что так. Думаю дальше.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
ILTB
Neophyte
Neophyte
Posts: 12
Joined: 20.12.2016 13:37

Re: Получение Durability, через ToolTip.

Post by ILTB »

Vizit0r
На самом деле скрипт написанный в самом первом посте, у меня отрабатывает отлично. Без багов.
А вот второй у меня работает криво. Да и написан видимо также.
Или я что-то неправильно понял?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Получение Durability, через ToolTip.

Post by Vizit0r »

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