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

Нужен пример. Трейд окно.

тут можно задать вопрос по скриптингу
Post Reply
HeadShot1989
Neophyte
Neophyte
Posts: 13
Joined: 11.07.2013 6:04

Нужен пример. Трейд окно.

Post by HeadShot1989 »

Как правильней организовать цикл? Хочу автоскупщика у плееров скрипт наваять ибо мой сервер не имеет автобаев... Использовал некоторые наработки, найденые на форуме. Почему-то мой мозг отказывается дружить с циклами, можно не кодом, просто пример на словах. Хочу скупать один итем.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Нужен пример. Трейд окно.

Post by Vizit0r »

на словах - цикл это тоде самое, что для одного захода, только заключенное в while XXX do begin end;

А если серьезно - ТЗ отсутствует.
Подробнее на словах опиши пошагово операции, которые ты хочешь сделать, глядишь и самому понятнее будет (ага, блок-схемы, информатика, 8 класс :))
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
HeadShot1989
Neophyte
Neophyte
Posts: 13
Joined: 11.07.2013 6:04

Re: Нужен пример. Трейд окно.

Post by HeadShot1989 »

:) у нас трэш с информатикой был поэтому :)

Короче в цикл заключаем:

Чар ищет в пределах 2ух тайлов человека по типу,
если нашел, то проверяет есть ли гп в бекпаке,
если нашел, то проверяет не висит ли трейд
если висит, то проверяет кол-во трейдов,
если больше 1, то закрывает остальные кроме нулевого,
проверяет что за итем в трейде,
если нужный мне, то перемещает оплату в свой контейнер трейда,
ставит галку в подтверждении,
ждет 15 сек, проверяет не висит ли этот же самый трейд,
если висит то CancelTrade.

Вот что у меня в текстовике было накидано перед тем как я начал туда код нафигачивать. Стоит ли тут что-то разбивать по процедурам, или в один программ все уместить, проверки по грамотрей может сделать...
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Нужен пример. Трейд окно.

Post by Vizit0r »

ну и нормально расписано. Я правда не понял, чего там закрываем все, кроме именно нулевого, ну да ладно, дело хозяйское, ему виднее.
Теперь давай то же самое переводи в код, а с вопросами или сложными моментами (хотя их тут нет) помогу.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
HeadShot1989
Neophyte
Neophyte
Posts: 13
Joined: 11.07.2013 6:04

Re: Нужен пример. Трейд окно.

Post by HeadShot1989 »

это всё уже давно в коде, наоборот я переводил в простые слова сидел :lol: Закрываем все кроме нулевого, что бота не завалили ненужными трейдами, и продавали по принципу "В очередь!!! В очередь, *:"&^$% &%@*(!"
Подумываю заключить все это примерно так

Code: Select all

Program BuyGS;
const
*****************
var
*****************
Begin
 while not dead do
    begin
     если в журнале есть строка 'sell GS' то
       begin
        вышеописанные действия;
       end;
     ClearJournal;
    end;
end.
И Еще, где расставить задержки, дабы не нагружать проц, я еще парой клиентов копаю-фармлю и одним сам контролю ПвП-ПвМ обычно. Проц сильный, но загрузить можно что угодно кривым кодом :)
P.S: сам когда пишу вспоминаю твою подпись на форуме и стараюсь придерживаться этого совета :mrgreen:
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Нужен пример. Трейд окно.

Post by Vizit0r »

качественно загрузить проц можно в общем случае только одним действием - циклом без задержки, вида

while XXX do
begin

end;
= 99% загрузки одного ядра.

добавить внутрь хотя бы Wait(30) - и все, проблемы нет.


по поводу трейдов - может тогда наоборот, оставлять не нулевой трейд, а последний?
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
HeadShot1989
Neophyte
Neophyte
Posts: 13
Joined: 11.07.2013 6:04

Re: Нужен пример. Трейд окно.

Post by HeadShot1989 »

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

Re: Нужен пример. Трейд окно.

Post by Vizit0r »

В проверках без if не обойдешься вообще-то, так что нормально.

P.S. много иф - это когда я в каком-то там классе попал на олимпиаду по программированию, хотя знания мои стремились к нулю (но у остальных они нулями и были), и на этой самой олимпиаде из-за банального незнания case на 2х двойных листках нарисовал код где-то в полсотню ифов. Учитель офигел, мягко говоря, когда увидел этот шедевр.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
HeadShot1989
Neophyte
Neophyte
Posts: 13
Joined: 11.07.2013 6:04

Re: Нужен пример. Трейд окно.

Post by HeadShot1989 »

Code: Select all

Program BuyGS;

const
GoldCoin=$0EED;//тип золота
Gstone=$3198;//тип покупаемого предмета

var
GSInContainer,TransferGP,OppContainer,MyContainer,client:Cardinal;
j:integer;

Begin
while not dead do
	begin  
	wait(100);//ждем фразы sell GS в журнале для дальнейшего действия
	if WaitJournalLine(now,'sell GS',60000)=true then
		begin
		findtype($0190,ground);//ищем по типу чара в пределах FindDistance
		client:=finditem;
		if client <> 0 then
			begin
			if (CountEx(GoldCoin,$0000,backpack)>35000) then
				begin
				uosay('; Добрый день, '+GetName(client)+'! Я покупаю God Stone по 35k');
				wait(1500);
				uosay('; Просто киньте в трейд свои God Stone, у вас есть 20 секунд.');
				wait(20000);
				If IsTrade=true then
					begin
					if TradeCount()>0 then
						begin
						for j:=TradeCount()-1 DownTo 0 do						
						CancelTrade(j);
						checklag(3000);
						end;
					If GetTradeOpponent(0)=client Then
						begin
						OppContainer:=GetTradeContainer(0,2);
						MyContainer:=GetTradeContainer(0,1);
						if (CountEx(Gstone,$0A8C,OppContainer))>0 then
							begin
							checklag(3000);
							uosay('; У вас 15 секунд для подтверждения сделки!');
							GSInContainer:=(CountEx(Gstone,$0A8C,OppContainer));
							TransferGP:=(GSInContainer*35000);
							FindTypeEx(GoldCoin,$0000,backpack,True);
							MoveItem(FindItem,TransferGP,MyContainer,0,0,0);
							wait(15000);
							if (TradeCheck(0,2))=true then
								begin
								ConfirmTrade(0);
								end
								else
								wait(500);
								uosay('Вы не подтвердили сделку вовремя!');
                CancelTrade(0);								
              end;
            end;
          end;
        end;
      end;
      ClearJournal;
    end;
  end;
End.
Что-то не так я накодил походу. Чар реагирует на 'sell GS', но закрывает окно трейда через 20 сек если ему кидаешь итем...
Еще и эта строка '; Добрый день, '+GetName(client)+'! Я покупаю God Stone по 35k' не входит полностью походу, разбить на две?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Нужен пример. Трейд окно.

Post by Vizit0r »

форматирование у тебя в коде полный писец.

Code: Select all

Program BuyGS;

const
GoldCoin=$0EED;//тип золота
Gstone=$3198;//тип покупаемого предмета

var
GSInContainer,TransferGP,OppContainer,MyContainer:Cardinal;
stime : TDateTime;
j:integer;
             
Begin
while not dead do //ждем фразы sell GS в журнале для дальнейшего действия
  if WaitJournalLine(now,'sell GS',60000) then
  begin
    if (CountEx(GoldCoin,$0000,backpack)>35000) then
    begin
     if TradeCount>0 then
      begin
        for j:=TradeCount-1 DownTo 0 do                  
        CancelTrade(j);
        checklag(3000);
      end;
      uosay('; Добрый день, '+GetName(LineID)+'! Я покупаю God Stone по 35k');
      wait(1500);
      uosay('; Просто киньте в трейд свои God Stone, у вас есть 20 секунд.');
      wait(20000);
      If IsTrade and (GetTradeOpponent(0)=LineID) Then
      begin
        OppContainer:=GetTradeContainer(0,2);
        MyContainer:=GetTradeContainer(0,1);
        if (CountEx(Gstone,$0A8C,OppContainer))>0 then
        begin
          checklag(3000);
          uosay('; У вас 15 секунд для подтверждения сделки!');
          GSInContainer:=(CountEx(Gstone,$0A8C,OppContainer));
          TransferGP:=(GSInContainer*35000);
          FindTypeEx(GoldCoin,$0000,backpack,True);
          MoveItem(FindItem,TransferGP,MyContainer,0,0,0);
          AddToSystemJournal(DateTimeToStr(Now));
          stime := Now;
          repeat 
            wait(100); 
          until TradeCheck(0,2) or (Now > stime + 15/(1440*60));    
          AddToSystemJournal(DateTimeToStr(Now));
          if TradeCheck(0,2) then
            ConfirmTrade(0)
          else
          begin
            wait(500);
            uosay('Вы не подтвердили сделку вовремя!');
            CancelTrade(0);                        
          end;
        end;
      end;
    end
    else
      uosay('Закончились деньги, приходите позже!');
  end
  else
    wait(100); 
End.
немного смущает структура, но мне лень сейчас перелопачивать его, тем более что проверить не могу на шарде.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply