Page 1 of 1

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

Posted: 2007-04-28 18:18:24
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

Posted: 2007-04-28 18:47:08
by Rivory
А чё за функция val() ?

Posted: 2007-04-28 18:58:16
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

Posted: 2007-04-28 20:58:10
by DerMeister =)
Rivory wrote:А чё за функция val() ?

!RTFM!

Posted: 2007-04-30 10:40:23
by Sanch
А что нить кроме флуда сдесь появится?

Posted: 2007-04-30 14:02:47
by Destruction
После звёздочек идёт только пауза 10сек, а вот изменение глобалок - может влиять.

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

Почитай код внимательнее.

Posted: 2007-05-02 10:22:12
by Sanch
Звездочками я обозначил продолжение самого скрипта, endif от проблемного элемента там присутствует в нужном месте, весь скрипт не стал выкладывать тк там представлены нетривеальные решения проблем в пвп, в своих интересах не стал выкладывать фактически готовый продукт, на написание которого ушло не мало времени.

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

Posted: 2007-05-02 22:58:13
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, но в них тоже не вижу ничего, что могло быть не так.

Posted: 2007-05-02 22:59:47
by Destruction
Sanch wrote:Звездочками я обозначил продолжение самого скрипта, endif от проблемного элемента там присутствует в нужном месте, весь скрипт не стал выкладывать тк там представлены нетривеальные решения проблем в пвп, в своих интересах не стал выкладывать фактически готовый продукт, на написание которого ушло не мало времени.

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

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

Posted: 2007-05-02 23:14:31
by Nmy
DerMeister =) wrote:
Rivory wrote:А чё за функция val() ?

!RTFM!


грубовато :lol:

Posted: 2007-05-03 06:57:00
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

Posted: 2007-05-03 08:31:14
by Destruction
Хмм, один за одним - та запросто.

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

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

Если нет - соответсвенно не вызывать боттлтаймер и использвовать альтернативные методы восстановления тех или иных характеристик.

Posted: 2007-05-03 09:35:09
by Sanch
Сейчас попробую, но почему он игрорирует проверку глобальной переменной котороя меняется не зависемо от наличия бутылки остается загадкой.

Posted: 2007-05-03 10:10:07
by Destruction
Sanch wrote:Сейчас попробую, но почему он игрорирует проверку глобальной переменной котороя меняется не зависемо от наличия бутылки остается загадкой.

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

Задумайся над логикой скрипта и своих слов.

Posted: 2007-05-03 14:58:00
by Sanch
Полностью изменил скрипт на использование бутылок, добавил их пересчет в начало скрипта, работает на ура. Что касается предыдущего, то при запуске ботлтаймера переменная менялась на единицу, при этом основной скрипт при проверке равна ли переменная нулю, делал одно и то же, да же если нулю она не ровнялась.

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