Проблема с бутылками

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Проблема с бутылками

Post by Sanch »

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

Code: Select all

sub StartPvP()
var replay, x, y, dx, dy, hp, str, dex, int, mana, id, name, serial = '0x00000000'
str = uo.str
dex = uo.dex
int = uo.int
uo.deletejournal()
while not uo.dead()
  replay = 0
  name = uo.getname('lastattack')
  if serial <> uo.getserial('lastattack') then
    uo.concolor('0x0085')
    uo.print('New Aim Detected')
    uo.print('Spell: Clumsy >>> '+name)
    uo.concolor('0x0000')
    uo.deletejournal('Uus jux')
    uo.deletejournal('The spell fizzles.')
    mana = uo.mana
    uo.cast('Clumsy', 'lastattack')
    repeat
      wait(10)
    until uo.injournal('Uus Jux')
    uo.msg(' ')
    uo.msg(' ')
    uo.msg(' ')
    repeat
      wait(100)
    until uo.injournal('The spell fizzles.') or uo.mana < mana
    uo.attack('lastattack')
    serial = uo.getserial('lastattack')
  else
    serial = uo.getserial('lastattack')
  endif   
  if uo.injournal('You are frozen') then
    uo.setglobal('CancelSpell', '1')
    replay = 1
    x = uo.getx('self')
    y = uo.gety('self')
    hp = uo.life()
    uo.findtype('0x0F03', '0x09CF')
    if uo.findcount() > 0 then
      uo.concolor('0x0085')
      uo.print('Frozen Detected')
      uo.print('Spell: Magic Arrow >>> Antifreeze')
      uo.concolor('0x0000')
      repeat
        uo.deletejournal('The spell fizzles.')
        uo.deletejournal('In Por Ylem')
        uo.waittargetobject('finditem')
        uo.cast('Magic Arrow')
        repeat
          wait(10)
        until uo.injournal('In Por Ylem')
        uo.msg(' ')
        uo.msg(' ')
        uo.msg(' ')
        repeat
          wait(100) 
          dx = uo.getx('self')
          dy = uo.gety('self')
        until x <> dx or y <> dy or uo.injournal('The spell fizzles.') or uo.life < hp
      until not uo.injournal('The spell fizzles.')
    else
      uo.concolor('0x0085')
      uo.print('!!!Antifreeze not found!!!')
      uo.concolor('0x0000')
      repeat
        wait(100) 
        dx = uo.getx('self')
        dy = uo.gety('self')
      until x <> dx or y <> dy
    endif
    uo.deletejournal('You are frozen')
    uo.attack('lastattack')
    uo.setglobal('CancelSpell', '0')
  else
    if val(uo.getglobal('BottleTime')) == 0 then
      if replay == 0 then
        if uo.life < (str/3) then       
          replay = 1
          uo.usetype('0x0F0E', '0x09BB')
          uo.exec('exec BottleTimer')
        else
          if uo.mana < (int-50) then
            replay = 1
            uo.usetype('0x0F0E', '0x09BB')
            uo.exec('exec BottleTimer')
          else
            if uo.stamina < (dex/5) then
              replay = 1
              uo.usetype('0x0F0E', '0x0997')
              uo.exec('exec BottleTimer')
            else
              wait(10)
            endif
          endif
        endif
      else
        wait(10)
      endif
    else
      wait(100)
    endif
  endif
wend
end sub

sub BottleTimer()
uo.setglobal('BottleTime', '1')
wait(10000)
uo.setglobal('BottleTime', '0')
end sub
Last edited by Sanch on 2007-05-02 10:38:55, edited 3 times in total.
Rivory
Posts: 205
Joined: 2005-01-06 11:49:28

Post by Rivory »

А чё за функция val() ?
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Точно не помню, она что-то во что-то преобразует, без нее работать не будет, проверь сам, мне обьясняли как то давно, но я уже забыл.

Code: Select all

sub test()
var a, b
uo.setglobal('aim', '1')
a = uo.getglobal('aim')
b = val(uo.getglobal('aim'))
uo.print('aim '+str(a))
uo.print('aim '+str(b))
end sub


"а" вроде будет равно 0, а "b" как и задумано 1
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Rivory wrote:А чё за функция val() ?

!RTFM!
DerMeister сейчас на нейрале!
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

А что нить кроме флуда сдесь появится?
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

После звёздочек идёт только пауза 10сек, а вот изменение глобалок - может влиять.

Только вот ты нужный фрагмент кода как раз обрезал..

Почитай код внимательнее.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Звездочками я обозначил продолжение самого скрипта, endif от проблемного элемента там присутствует в нужном месте, весь скрипт не стал выкладывать тк там представлены нетривеальные решения проблем в пвп, в своих интересах не стал выкладывать фактически готовый продукт, на написание которого ушло не мало времени.

Отпостил полную, но значительно урезанную копию скрипта, см выше.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Сам BattleTimer проблем вызывать не может - всего три банальных строки.

В скрипте я вижу такие строки:

Code: Select all

    if val(uo.getglobal('BottleTime')) == 0 then 
      if replay == 0 then
        if uo.life < (str/3) then       
          replay = 1
          uo.usetype('0x0F0E', '0x09BB')
          uo.exec('exec BottleTimer')
        else
          if uo.mana < (int-50) then
            replay = 1
            uo.usetype('0x0F0E', '0x09BB')
            uo.exec('exec BottleTimer')
          else
            if uo.stamina < (dex/5) then
              replay = 1
              uo.usetype('0x0F0E', '0x0997')
              uo.exec('exec BottleTimer')
            else
              wait(10)
            endif
          endif
        endif
      else
        wait(10)
      endif
    else
      wait(100)
    endif


Которые непосредственно связаны со скриптом BottleTimer, но в них тоже не вижу ничего, что могло быть не так.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Sanch wrote:Звездочками я обозначил продолжение самого скрипта, endif от проблемного элемента там присутствует в нужном месте, весь скрипт не стал выкладывать тк там представлены нетривеальные решения проблем в пвп, в своих интересах не стал выкладывать фактически готовый продукт, на написание которого ушло не мало времени.

Отпостил полную, но значительно урезанную копию скрипта, см выше.

Если ты действительно думаешь, что кто-то кто может читать код не может придумать решение такое же / лучше твоего - ты крупно ошибаешся.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Nmy
Expert!
Posts: 2152
Joined: 2005-09-14 15:31:58
Location: Latvia

Post by Nmy »

DerMeister =) wrote:
Rivory wrote:А чё за функция val() ?

!RTFM!


грубовато :lol:
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Если ты действительно думаешь, что кто-то кто может читать код не может придумать решение такое же / лучше твоего - ты крупно ошибаешся.


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

Сделал его в скрипте отдельной процедурой, правда это не дало желаемого эффекта.

Code: Select all

    if uo.life < str/3 or uo.mana < int-50 or uo.stamina < dex/5 then
      if val(uo.getglobal('BottleTime')) == 0 then
        if uo.life < str/3 then       
          uo.usetype('0x0F0E', '0x09BB')
          uo.exec('exec BottleTimer')
        else
          if uo.mana < int-50 then
            uo.usetype('0x0F0E', '0x09BB')
            uo.exec('exec BottleTimer')
          else
            if uo.stamina < dex/5 then
              uo.usetype('0x0F0E', '0x0997')
              uo.exec('exec BottleTimer')
            else
              wait(10)
            endif
          endif
        endif
      else
        wait(10)
      endif
    else
      wait(10)
    endif
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Хмм, один за одним - та запросто.

Вобщем проблему осознал :)

Перед попыткой выпить банку - добавь проверочку, есть ли вообще такая баночка.

Если нет - соответсвенно не вызывать боттлтаймер и использвовать альтернативные методы восстановления тех или иных характеристик.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Сейчас попробую, но почему он игрорирует проверку глобальной переменной котороя меняется не зависемо от наличия бутылки остается загадкой.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Sanch wrote:Сейчас попробую, но почему он игрорирует проверку глобальной переменной котороя меняется не зависемо от наличия бутылки остается загадкой.

Из твоих слов он следует, что он-таки не игнорирует.

Задумайся над логикой скрипта и своих слов.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

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

Пара вопросов: кто нить знает какой нить ярко красный цвет в уо (который можно использовать для сообщений инжекта типа uo.concolor('0х0085') ), и второе, то что ID сообщений сервера определяется как 0x00000000 - это нормально? Речь идет о сообщениях о том, что тебя травит ядом или ты парализован, тестил я правда это пока только на локальной сфере.
Post Reply