Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> bandageself - почему не работает?
ikorus
сообщение 3.11.2014, 14:27
Сообщение #1


**

Группа: Пользователи
Наличность: 0
Пользователь №: 16.948
Возраст: 36



В клиенте встроенный макрос bandageself не работает. Допускаю, конечно, что я просто не разобрался, как правильно его использовать, но информации по тому, как правильно я не нашел, поэтому можно считать, что не работает.

Кто-нибудь знает, как этот макрос работает?

Как альтернативу я пробую написать скрипт на хил, срабатывающий от текстовой команды, но уперся в проблему: чтобы скрипт запустить, нужен даблклик по объекту (IMG:style_emoticons/default/sad.gif) Каким еще образом можно запустить скрипт, а еще лучше - каким образом можно даблклик эмулировать в скрипте?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 3.11.2014, 14:37
Сообщение #2


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22569
Из: Северная Корея
Пользователь №: 11.273



для работы макрос команды bandageself нужно создать ивент(событие) на стороне сервера. В качестве примера можно смотреть как это работает с другими макрос командами, к примеру юз скилла и т.д.

Цитата
Как альтернативу я пробую написать скрипт на хил, срабатывающий от текстовой команды, но уперся в проблему: чтобы скрипт запустить, нужен даблклик по объекту sad.gif Каким еще образом можно запустить скрипт, а еще лучше - каким образом можно даблклик эмулировать в скрипте?

Вероятнее всего сервер уже содержит операторы типа: FindObject и UseObject, соответственно первым мы сможем найти требуемую вещь, вторым инициировать использование указанной вещи(дабл клик).


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ikorus
сообщение 3.11.2014, 16:54
Сообщение #3


**

Группа: Пользователи
Наличность: 0
Пользователь №: 16.948
Возраст: 36



Цитата(Juzzver @ 3.11.2014, 17:37) *

для работы макрос команды bandageself нужно создать ивент(событие) на стороне сервера. В качестве примера можно смотреть как это работает с другими макрос командами, к примеру юз скилла и т.д.
Вероятнее всего сервер уже содержит операторы типа: FindObject и UseObject, соответственно первым мы сможем найти требуемую вещь, вторым инициировать использование указанной вещи(дабл клик).


Не могу найти, где макросы живут на сервере
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 3.11.2014, 17:03
Сообщение #4


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



Цитата(ikorus @ 3.11.2014, 12:27) *

Как альтернативу я пробую написать скрипт на хил, срабатывающий от текстовой команды, но уперся в проблему: чтобы скрипт запустить, нужен даблклик по объекту (IMG:style_emoticons/default/sad.gif) Каким еще образом можно запустить скрипт, а еще лучше - каким образом можно даблклик эмулировать в скрипте?


Тебе не нужно ничего и никуда нажимать на стороне сервера для хила.
тебе нужно отправить клиенту таргет, подхилить цель и сделать всё необходимое что делают обычно твои бинты, затем удалить бинт.
Другими словами твоя команда хила должна быть на 99% такой же как твой скрипт бинта.
Только запускаться этот скрипт будет не после использования объекта, а после ввода команды.

Код

use uo;
program heal_me(who)
      хил_меня
      забираем бинт
endprogram


и этот скрипт ты можешь запускать из команды или после даблклика на бинт.


Что касается опции bandageself - нужно разбираться как она работает в клиенте.
Нужно знать производит ли клиент все действия с бинтами самостоятельно, или серверу отправляется пакет с "командой" подхилить себя (в данном случае нужно будет писать хук)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ikorus
сообщение 3.11.2014, 20:46
Сообщение #5


**

Группа: Пользователи
Наличность: 0
Пользователь №: 16.948
Возраст: 36



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

Код
use uo;
use os;
use util;
use math;

include "include/itemUtil";
include ":attributes:attributes";
include ":classes:classes";
include ":death:resurrection";
include ":equipment:protections";
include ":timedscripts:timedScripts";

program textcmd_BandageSelf( who )

    if( who.dead )
        return 0;
    endif
  
    if( who.poisoned )
        CureSelf( who );
    else
        HealPatient( who );
    endif

endprogram

function CureSelf( who )

        SendSysMessage( who, "You start to cure yourself." );

    var vital := AP_GetVital( who, HITS ),
    delay := 10;
        
    while( Cint( delay ))
        Sleep( 1 );
        delay -= 1;
        if( who.dead || !who.poisoned )
            SendSysMessage( who, "You have lost your concentration." );
            return 0;
        elseif( AP_GetVital( who, HITS ) < vital )
                SendSysMessage( who, "Yours fingers slip..." );
                CreateItemInBackpack( who, 0x0e20, 1 );
                vital := AP_GetVital( who, HITS );
        endif
    endwhile

    var current_poison := CInt( GetObjProperty( who, "#PoisonedLevel" ));
    if( !current_poison )
        SendSysMessage( who, "That is not poisoned." );
        return 0;
    endif
        
    var bonus := CInt( GetMobileProtection( who, "HealingIncrease" ));
    if( bonus )
        bonus := CInt( bonus * 5 );
    endif
        
    var difficulty := CInt(( current_poison * 25 ) + 15 ),
    healing := AP_GetSkill( who, HEALING );

    if( SkillCheck( who, HEALING, CInt( difficulty )) > 0 || healing >= CInt( difficulty - bonus ))

        SendSysMessage( who, "You cured level "+current_poison+" poison." );
        TS_LowerDuration( who, "DefaultPoison", -1 );
                
        if( who.serial != who.serial )
            var heal := CInt( HL_GetAmount( who ) * 0.25 );
            SendSysMessage( who, "You heal "+heal+" damages." );
            HealDamage( who, heal );
        endif
    else
        SendSysMessage( who, "You couldn't cure yourself!" );
    endif
        
    CreateItemInBackpack( who, 0x0e20, 2 );

    return 1;
endfunction

function HealPatient( who )

    var max_vital := AP_GetStat( who, STRENGTH ),
    vital := AP_GetVital( who, HITS );
            
    if( CInt( vital ) >= CInt( max_vital ))
           SendSysMessage( who, "This patient don't have a bruise!" );
        return 0;
    else
        SendSysMessage( who, "You start to heal yourself." );
    endif
            
    var delay := 7;
    while( Cint( delay ))
        Sleep( 1 );
        delay -= 1;
        
        if( CInt( vital ) >= CInt( max_vital ))
            SendSysMessage( who, "This patient don't have a bruise!" );
            return 0;
        elseif( AP_GetVital( who, HITS ) < vital )
                SendSysMessage( who, "Yours fingers slip..." );
                CreateItemInBackpack( who, 0x0e20, 1 );
                vital := AP_GetVital( who, HITS );
        endif
    endwhile
        
        var difficulty := CInt( AP_GetStat( who, STRENGTH ) - AP_GetVital( who, HITS ));
        if( difficulty > 65 )
                difficulty := 65;
        endif

        if( SkillCheck( who, HEALING, difficulty ) > 0 )
        
            var heal := HL_GetAmount( who );
            SendSysMessage( who, "You heal "+heal+" damages." );
            HealDamage( who, heal );
        else
            SendSysMessage( who, "You couldn't heal yourself." );
        endif
        
        CreateItemInBackpack( who, 0x0e20, 1 );
    
    return 1;
endfunction

function HL_GetAmount( who )

    var heal_skill := CInt( AP_GetSkill( who, HEALING ) / 10 );
    var anat_skill := CInt( AP_GetSkill( who, ANATOMY ) / 15 );

        var heal := RandomDiceRoll( CInt( heal_skill )+"d4+"+CInt( heal_skill )) + RandomDiceRoll( "1d8+2" ) + CInt( anat_skill );

        var bonus := CInt( GetMobileProtection( who, "HealingIncrease" ));
    if( bonus )
        heal *= CDbl(( bonus * 0.1 ) + 1 );
    endif

        if( GetObjProperty( who, WARRIOR ))
                heal *= ClasseBonus( who, WARRIOR );
        endif
        
        return CInt( heal );
endfunction


Цитата(RL_ka @ 3.11.2014, 20:03) *

Что касается опции bandageself - нужно разбираться как она работает в клиенте.
Нужно знать производит ли клиент все действия с бинтами самостоятельно, или серверу отправляется пакет с "командой" подхилить себя (в данном случае нужно будет писать хук)


Пакеты слушать - это пока для меня слишком круто )))
Предпочел воспользоваться поводом для написания скрипта
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 3.11.2014, 21:24
Сообщение #6


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



Ну не удивительно.
У тебя вообще ни в одном месте скрипта нет ни единого упоминания о бинтах(IMG:style_emoticons/default/smile.gif)
Скрипт просто хилит и создаёт грязный бинт(IMG:style_emoticons/default/smile.gif)

Нужно сначала бинты найти в бекпаке.
Я намеренно не буду писать тебе что и как, чтобы ты сам хоть немного "вливался" в это (IMG:style_emoticons/default/smile.gif)
Простейшая проверка на наличие бинтов пишется вот так:
Код

var binti;
foreach item in ( EnumerateItemsInContainer( who.backpack ) )
    if (item.objtype == 0x0e20) // или любой другой тип бинтов
        binti := item;
    endif
endforeach

if (!binti)
    SendSysMessage(who, "You have no bandages....");
    return 0;
endif


С помощью этой проверки ты во-первых устанавливаешь наличие бинтов в бекпаке, а во-вторых получаешь на них ссылку, для дальнейшего использования в скрипте (удаления 1 штуки)
Подумай сам куда это лучше всего вставить(IMG:style_emoticons/default/smile.gif)
Все использованные функции стандартные, отсюда http://docs.polserver.com/pol099/index.php
Как забрать 1 бинт можешь найти по той же ссылке(IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ikorus
сообщение 5.11.2014, 15:17
Сообщение #7


**

Группа: Пользователи
Наличность: 0
Пользователь №: 16.948
Возраст: 36



Цитата(RL_ka @ 4.11.2014, 0:24) *

Ну не удивительно.
У тебя вообще ни в одном месте скрипта нет ни единого упоминания о бинтах(IMG:style_emoticons/default/smile.gif)
Скрипт просто хилит и создаёт грязный бинт(IMG:style_emoticons/default/smile.gif)

Нужно сначала бинты найти в бекпаке.
Я намеренно не буду писать тебе что и как, чтобы ты сам хоть немного "вливался" в это (IMG:style_emoticons/default/smile.gif)
Простейшая проверка на наличие бинтов пишется вот так:
Код

var binti;
foreach item in ( EnumerateItemsInContainer( who.backpack ) )
    if (item.objtype == 0x0e20) // или любой другой тип бинтов
        binti := item;
    endif
endforeach

if (!binti)
    SendSysMessage(who, "You have no bandages....");
    return 0;
endif


С помощью этой проверки ты во-первых устанавливаешь наличие бинтов в бекпаке, а во-вторых получаешь на них ссылeку, для дальнейшего использования в скрипте (удаления 1 штуки)
Подумай сам куда это лучше всего вставить(IMG:style_emoticons/default/smile.gif)
Все использованные функции стандартные, отсюда http://docs.polserver.com/pol099/index.php
Как забрать 1 бинт можешь найти по той же ссылке(IMG:style_emoticons/default/smile.gif)


Скрипт воо ще читерский вышел - не только бинты не проверяются, но и занятость перса тоже. Можно вызывать хил даже во время другого хила, можно во время хайда и медитации (IMG:style_emoticons/default/biggrin.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 5.11.2014, 16:27
Сообщение #8


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



Ну... тебе всё-таки придётся начать погружаться в глубины eScripta, потому что даже самые простые на первый взгляд вещи требуют довольно много знаний (IMG:style_emoticons/default/smile.gif)

По поводу проверки занятости персонажа - я с таким не сталкивался, и однозначного решения не знаю, но можно попробовать проверить его занятость с помощью
character.attached

http://docs.polserver.com/pol099/objref.php#Character

Код

if (who.attached)
    SendSysMessage(who, "You are already doing something else.");
    return;
endif
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ikorus
сообщение 5.11.2014, 21:58
Сообщение #9


**

Группа: Пользователи
Наличность: 0
Пользователь №: 16.948
Возраст: 36



Цитата(RL_ka @ 4.11.2014, 0:24) *

Простейшая проверка на наличие бинтов пишется вот так:
Код

var binti;
foreach item in ( EnumerateItemsInContainer( who.backpack ) )
    if (item.objtype == 0x0e20) // или любой другой тип бинтов
        binti := item;
    endif
endforeach

if (!binti)
    SendSysMessage(who, "You have no bandages....");
    return 0;
endif



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

Код

use uo;
use os;
use util;
use math;

include "include/itemUtil";
include ":attributes:attributes";
include ":classes:classes";
include ":death:resurrection";
include ":equipment:protections";
include ":timedscripts:timedScripts";

program textcmd_BandageSelf( who )

    if( who.dead )
        return 0;
    endif

    var bandage;
    
    foreach item in ( EnumerateItemsInContainer( who.backpack ) )
        if (item.objtype == 0xEE9)
            bandage := item;
        endif
    endforeach

    if (!bandage)
        SendSysMessage(who, "You have no bandages....");
        return 0;
    endif
  
    if( who.poisoned )
        CureSelf( who, bandage );
    else
        HealPatient( who, bandage );
    endif

endprogram

function CureSelf( who, bandage )

    if( !SubtractAmount( bandage, 2 ))
        SendSysMessage( who, "You don't have enough bandages." );
        return 0;
    else
        SendSysMessage( who, "You start to cure yourself." );
    endif

    var vital := AP_GetVital( who, HITS ),
    delay := 10;
        
    while( Cint( delay ))
        Sleep( 1 );
        delay -= 1;
        if( who.dead || !who.poisoned )
            SendSysMessage( who, "You have lost your concentration." );
            return 0;
        elseif( AP_GetVital( who, HITS ) < vital )
            if( !SubtractAmount( bandage, 2 ))
                SendSysMessage( who, "You don't have enough bandages." );
                SendSysMessage( who, "You couldn't cure yourself." );
                return 0;
            else
                SendSysMessage( who, "Yours fingers slip..." );
                CreateItemInBackpack( who, 0x0e20, 1 );
                vital := AP_GetVital( who, HITS );
            endif
        endif
    endwhile

    var current_poison := CInt( GetObjProperty( who, "#PoisonedLevel" ));
    if( !current_poison )
        SendSysMessage( who, "That is not poisoned." );
        return 0;
    endif
        
    var bonus := CInt( GetMobileProtection( who, "HealingIncrease" ));
    if( bonus )
        bonus := CInt( bonus * 5 );
    endif
        
    var difficulty := CInt(( current_poison * 25 ) + 15 ),
    healing := AP_GetSkill( who, HEALING );

    if( SkillCheck( who, HEALING, CInt( difficulty )) > 0 || healing >= CInt( difficulty - bonus ))

        SendSysMessage( who, "You cured level "+current_poison+" poison." );
        TS_LowerDuration( who, "DefaultPoison", -1 );
                
        if( who.serial != who.serial )
            var heal := CInt( HL_GetAmount( who ) * 0.25 );
            SendSysMessage( who, "You heal "+heal+" damages." );
            HealDamage( who, heal );
        endif
    else
        SendSysMessage( who, "You couldn't cure yourself!" );
    endif
        
    CreateItemInBackpack( who, 0x0e20, 2 );

    return 1;
endfunction

function HealPatient( who, bandage )

    var max_vital := AP_GetStat( who, STRENGTH ),
    vital := AP_GetVital( who, HITS );
            
    if( CInt( vital ) >= CInt( max_vital ))
           SendSysMessage( who, "This patient don't have a bruise!" );
        return 0;
    elseif( !SubtractAmount( bandage, 1 ))
        SendSysMessage( who, "You don't have enough bandages." );
        return 0;
    else
        SendSysMessage( who, "You start to heal yourself." );
    endif
            
    var delay := 7;
    while( Cint( delay ))
        Sleep( 1 );
        delay -= 1;
        
        if( CInt( vital ) >= CInt( max_vital ))
            SendSysMessage( who, "This patient don't have a bruise!" );
            return 0;
        elseif( AP_GetVital( who, HITS ) < vital )
            if( !SubtractAmount( bandage, 1 ))
                SendSysMessage( who, "You don't have enough bandages." );
                SendSysMessage( who, "You couldn't heal yourself." );
                return 0;
            else
                SendSysMessage( who, "Yours fingers slip..." );
                CreateItemInBackpack( who, 0x0e20, 1 );
                vital := AP_GetVital( who, HITS );
            endif
        endif
    endwhile
        
        var difficulty := CInt( AP_GetStat( who, STRENGTH ) - AP_GetVital( who, HITS ));
        if( difficulty > 65 )
                difficulty := 65;
        endif

        if( SkillCheck( who, HEALING, difficulty ) > 0 )
        
            var heal := HL_GetAmount( who );
            SendSysMessage( who, "You heal "+heal+" damages." );
            HealDamage( who, heal );
        else
            SendSysMessage( who, "You couldn't heal yourself." );
        endif
        
        CreateItemInBackpack( who, 0x0e20, 1 );
    
    return 1;
endfunction

function HL_GetAmount( who )

    var heal_skill := CInt( AP_GetSkill( who, HEALING ) / 10 );
    var anat_skill := CInt( AP_GetSkill( who, ANATOMY ) / 15 );

        var heal := RandomDiceRoll( CInt( heal_skill )+"d4+"+CInt( heal_skill )) + RandomDiceRoll( "1d8+2" ) + CInt( anat_skill );

        var bonus := CInt( GetMobileProtection( who, "HealingIncrease" ));
    if( bonus )
        heal *= CDbl(( bonus * 0.1 ) + 1 );
    endif

        if( GetObjProperty( who, WARRIOR ))
                heal *= ClasseBonus( who, WARRIOR );
        endif
        
        return CInt( heal );
endfunction
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ikorus
сообщение 5.11.2014, 23:04
Сообщение #10


**

Группа: Пользователи
Наличность: 0
Пользователь №: 16.948
Возраст: 36



Цитата(RL_ka @ 5.11.2014, 19:27) *

Код

if (who.attached)
    SendSysMessage(who, "You are already doing something else.");
    return;
endif



этот атрибут блокирует использование хила только, когда перс занят: во время медицации теперь лечиться нельзя, как и во время майнинга или другого действия в цикле (loop).

попробовал вешать свойства объекта на чара на время хила, но не срабатывает фишка - все равно хилится, не ждет, пока закончит.

Вот куски нерабочей схемы

Код

    if( GetObjProperty( who, "#HealPatient" ) )
        SendSysMessage( who, "You must wait before being able to heal yourself again." );
        return 0;
    endif

    var heal;
    SetObjProperty( who, "#HealPatient", heal );
        ...
        тут хилимся
        ...
    EraseObjProperty( who, "#HealPatient" );



На самом деле attached указывает на используемый в данный момент персонажем скрипт. Если используется (скрипт "прикреплен" к персонажу), - то нельзя будет хилить. В остальных случая можно. Получается, что нужно добавить мой скрипт в число тех, которые лочат чара, и тогда все будет правильно реализовано. А остальное - костыли
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 6.11.2014, 2:25
Сообщение #11


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



Ну тогда остаётся последний вариант фикса "из простых" - вставить где-то в начале твоего скрипта это
Код
if (who.attached)
    SendSysMessage(who, "You are already doing something else.");
    return;
endif
Attach(who);
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
pager
сообщение 6.11.2014, 6:49
Сообщение #12


****

Apprentice
Сообщений: 147
Регистрация: 10.1.2006
Группа: Пользователи
Наличность: 0
Из: --
Пользователь №: 4.699
Возраст: --



Цитата(ikorus @ 6.11.2014, 1:04) *

этот атрибут блокирует использование хила только, когда перс занят:


Вот еще одно решение проблемы :
Скрипт выводит сообщение( с поддержкой множество языков ) если в группе PROC_SKILL есть процессы .Пример сообщения: Подождите пока завершится : Навык лечения.
Так же можно скрипту посылать событие с помощью функции MSendprocEvent например для того чтобы при смерти или выходе из игры персонажа, скрипт завершался мгновенно.

Если кого заинтересовало, то MsendProcEvent и другие includes лежат в пакете spawnernpc на форуме..


Код

/////////////////////////////////////////////
language.cfg
Language Rus
{
    Message_Wait_script                    Подождите пока завершится
        script_usebandage_name                            Навык лечения.

}

Language Enu
{
        Message_Wait_script                    Wait until the end
        script_usebandage_name                            Skill healing.

}

    

//////////////////////////////////////





Use uo;
Use os;
Use unicode;

Const PROC_SKILL  := “skill”;



var language_cfg          := ReadConfigFile(“:*:language”);


Program usebandage(who,bandage)
var lang      := MGetMobileLanguage(who);
if(!MGetProcDelay(who,PROC_SKILL,who,lang))
MsetProcPid(who,PROC_SKILL,”usebandage”,struct{pid := GetPid(),message := "script_usebandage_name”,level := 0});
Bandages(who,bandage,lang);
MsetProcPid(who,PROC_SKILL,”usebandage”);
endif
endprogram
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function Bandages(byref who,byref bandage,byref lang)
Код скрипта...........
...
….

endfunction

////////////////////////////////////////////////include functions ///////////////////////////////////////////////////
function MGetProcDelay(object,procname,mobile,lang,level := DEFAULT_PROC_LEVEL)
var prop     := MGetObjProperty(object,"#procpid",dictionary);
foreach name in (prop[procname].keys())
if(Cint(prop[procname][name].level) == Cint(level))
MConfigLanguageSendSysMessageUc(mobile,"message_wait_script",lang.langcode,": " +
MGetElement(GetConfigString(language_cfg[lang.langcode],prop[procname][name].message),prop[procname][name].message + " - language_cfg not found."),lang.font,lang.color);
return 1;
endif
endforeach
endfunction
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function MGetObjProperty(object,name,err := 0)
if(name in object.propnames())
return object.getprop(name);
else
return err;
endif
endfunction
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function MConfigLanguageSendSysMessageUc(who,name,langcode,text := "",fount := _DEFAULT_UCFONT,color := _DEFAULT_UCCOLOR)
return SendSysMessageUc(who,CAscZ(MGetElement(GetConfigstring(language_cfg[langcode],name),name + " - language_cfg not found ") + text),langcode,fount,color);
endfunction

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
function  MGetElement(structure,err := 0)
if(structure)
return structure;
else
return err;
endif
endfunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function MSetProcPid(mobile,procname,name,structure := 0)
set_critical(1);
Detach();
var prop := MGetObjProperty(mobile,"#procpid",dictionary);
if(!structure and !prop[procname].size() <= 1)
prop.erase(procname);
elseif(!structure)
prop[procname].erase(name);
elseif(!prop.exists(procname))
prop.insert(procname,dictionary{name -> structure});
else
prop[procname].insert(name,structure);
endif
mobile.setprop("#procpid",prop);
set_critical(0);
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
function MGetMobileLanguage(byref mobile)
return MGetObjProperty(mobile,"language",struct{langcode := "rus",font := _DEFAULT_UCFONT,color := _DEFAULT_UCCOLOR});
endfunction



Сообщение отредактировал RL_ka - 6.11.2014, 14:52
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ikorus
сообщение 6.11.2014, 22:18
Сообщение #13


**

Группа: Пользователи
Наличность: 0
Пользователь №: 16.948
Возраст: 36



Отладил вариант с навешиванием пропертисов - все работает как требуется!

Код
use uo;
use os;
use util;
use math;

include "include/itemUtil";
include ":attributes:attributes";
include ":classes:classes";
include ":death:resurrection";
include ":equipment:protections";
include ":timedscripts:timedScripts";

program textcmd_BandageSelf( who )

    if( who.dead )
        return 0;
    endif
    
    if (who.attached)
        SendSysMessage(who, "You are already doing something else.");
        return 0;
    endif
    
    var busy := GetObjProperty( who, "HealSelf" );
    
    if (busy == 1)
        SendSysMessage(who, "Already bandage yourself.");
        return 0;
    endif

    var bandage;
    
    foreach item in ( EnumerateItemsInContainer( who.backpack ) )
        if (item.objtype == 0xEE9)
            bandage := item;
        endif
    endforeach

    if (!bandage)
        SendSysMessage(who, "You have no bandages....");
        return 0;
    endif
        
    if( who.poisoned )
        CureSelf( who, bandage );
    else
        HealPatient( who, bandage );
    endif
    
    SetObjProperty( who, "HealSelf", 0 );

endprogram

function CureSelf( who, bandage )

    if( !SubtractAmount( bandage, 2 ))
        SendSysMessage( who, "You don't have enough bandages." );
        return 0;
    else
        SendSysMessage( who, "You start to cure yourself." );
        SetObjProperty( who, "HealSelf", 1 );
    endif

    var vital := AP_GetVital( who, HITS ),
    delay := 10;
        
    while( Cint( delay ))
        Sleep( 1 );
        delay -= 1;
        if( who.dead || !who.poisoned )
            SendSysMessage( who, "You have lost your concentration." );
            return 0;
        elseif( AP_GetVital( who, HITS ) < vital )
            if( !SubtractAmount( bandage, 2 ))
                SendSysMessage( who, "You don't have enough bandages." );
                SendSysMessage( who, "You couldn't cure yourself." );
                return 0;
            else
                SendSysMessage( who, "Yours fingers slip..." );
                CreateItemInBackpack( who, 0x0e20, 1 );
                vital := AP_GetVital( who, HITS );
            endif
        endif
    endwhile

    var current_poison := CInt( GetObjProperty( who, "#PoisonedLevel" ));
    if( !current_poison )
        SendSysMessage( who, "That is not poisoned." );
        return 0;
    endif
        
    var bonus := CInt( GetMobileProtection( who, "HealingIncrease" ));
    if( bonus )
        bonus := CInt( bonus * 5 );
    endif
        
    var difficulty := CInt(( current_poison * 25 ) + 15 ),
    healing := AP_GetSkill( who, HEALING );

    if( SkillCheck( who, HEALING, CInt( difficulty )) > 0 || healing >= CInt( difficulty - bonus ))

        SendSysMessage( who, "You cured level "+current_poison+" poison." );
        TS_LowerDuration( who, "DefaultPoison", -1 );
                
    else
        SendSysMessage( who, "You couldn't cure yourself!" );
    endif
        
    CreateItemInBackpack( who, 0x0e20, 2 );

    return 1;
endfunction

function HealPatient( who, bandage )

    var max_vital := AP_GetStat( who, STRENGTH ),
    vital := AP_GetVital( who, HITS );
    
    if( CInt( vital ) >= CInt( max_vital ))
           SendSysMessage( who, "This patient don't have a bruise!" );
        return 0;
    elseif( !SubtractAmount( bandage, 1 ))
        SendSysMessage( who, "You don't have enough bandages." );
        return 0;
    else
        SendSysMessage( who, "You start to heal yourself." );
        SetObjProperty( who, "HealSelf", 1 );
    endif
            
    var delay := 7;
    while( Cint( delay ))
        Sleep( 1 );
        delay -= 1;
        
        if( CInt( vital ) >= CInt( max_vital ))
            SendSysMessage( who, "This patient don't have a bruise!" );
            return 0;
        elseif( AP_GetVital( who, HITS ) < vital )
            if( !SubtractAmount( bandage, 1 ))
                SendSysMessage( who, "You don't have enough bandages." );
                SendSysMessage( who, "You couldn't heal yourself." );
                return 0;
            else
                SendSysMessage( who, "Yours fingers slip..." );
                CreateItemInBackpack( who, 0x0e20, 1 );
                vital := AP_GetVital( who, HITS );
            endif
        endif
    endwhile
        
        var difficulty := CInt( AP_GetStat( who, STRENGTH ) - AP_GetVital( who, HITS ));
        if( difficulty > 65 )
                difficulty := 65;
        endif

        if( SkillCheck( who, HEALING, difficulty ) > 0 )
        
            var heal := HL_GetAmount( who );
            SendSysMessage( who, "You heal "+heal+" damages." );
            HealDamage( who, heal );
        else
            SendSysMessage( who, "You couldn't heal yourself." );
        endif
        
        CreateItemInBackpack( who, 0x0e20, 1 );
    
    return 1;
    
endfunction

function HL_GetAmount( who )

    var heal_skill := CInt( AP_GetSkill( who, HEALING ) / 10 );
    var anat_skill := CInt( AP_GetSkill( who, ANATOMY ) / 15 );

        var heal := RandomDiceRoll( CInt( heal_skill )+"d4+"+CInt( heal_skill )) + RandomDiceRoll( "1d8+2" ) + CInt( anat_skill );

        var bonus := CInt( GetMobileProtection( who, "HealingIncrease" ));
    if( bonus )
        heal *= CDbl(( bonus * 0.1 ) + 1 );
    endif

        if( GetObjProperty( who, WARRIOR ))
                heal *= ClasseBonus( who, WARRIOR );
        endif
        
        return CInt( heal );
endfunction


С аттачем тоже хочу попробовать, но сегодня уже не буду

Сообщение отредактировал RL_ka - 7.11.2014, 1:22
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 7.11.2014, 0:33
Сообщение #14


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



Слабое место: если в момент задержки, между началом хила и окончанием, чар выйдет в логаут по какой-то причине, то HealSelf на нём навсегда останется равной еденице и твой скрипт перестанет работать.
В этом случае нужно обязательно прописать в logon и reconnect скрипты стирание этой проперти.

ps. В случае, если Attach удовлетворит всем твоим потребностям, то подобные "костыли" будут не нужны

Сообщение отредактировал RL_ka - 7.11.2014, 2:02
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ikorus
сообщение 7.11.2014, 20:24
Сообщение #15


**

Группа: Пользователи
Наличность: 0
Пользователь №: 16.948
Возраст: 36



Цитата(RL_ka @ 7.11.2014, 3:33) *

Слабое место: если в момент задержки, между началом хила и окончанием, чар выйдет в логаут по какой-то причине, то HealSelf на нём навсегда останется равной еденице и твой скрипт перестанет работать.
В этом случае нужно обязательно прописать в logon и reconnect скрипты стирание этой проперти.

ps. В случае, если Attach удовлетворит всем твоим потребностям, то подобные "костыли" будут не нужны


на самом деле хотелось поэкспериментировать с пропертисами )))

с аттачем все работает как надо:

Код
use uo;
use os;
use util;
use math;

include "include/itemUtil";
include ":attributes:attributes";
include ":classes:classes";
include ":death:resurrection";
include ":equipment:protections";
include ":timedscripts:timedScripts";

program textcmd_BandageSelf( who )

    if( who.dead )
        return 0;
    endif
    
    if (who.attached)
        SendSysMessage(who, "You are already doing something else.");
        return 0;
    endif
    
    var bandage;
    
    foreach item in ( EnumerateItemsInContainer( who.backpack ) )
        if (item.objtype == 0xEE9)
            bandage := item;
        endif
    endforeach

    if (!bandage)
        SendSysMessage(who, "You have no bandages....");
        return 0;
    endif
    
    Attach(who);
        
    if( who.poisoned )
        CureSelf( who, bandage );
    else
        HealPatient( who, bandage );
    endif
    
endprogram

function CureSelf( who, bandage )

    if( !SubtractAmount( bandage, 2 ))
        SendSysMessage( who, "You don't have enough bandages." );
        return 0;
    else
        SendSysMessage( who, "You start to cure yourself." );
    endif

    var vital := AP_GetVital( who, HITS ),
    delay := 10;
        
    while( Cint( delay ))
        Sleep( 1 );
        delay -= 1;
        if( who.dead || !who.poisoned )
            SendSysMessage( who, "You have lost your concentration." );
            return 0;
        elseif( AP_GetVital( who, HITS ) < vital )
            if( !SubtractAmount( bandage, 2 ))
                SendSysMessage( who, "You don't have enough bandages." );
                SendSysMessage( who, "You couldn't cure yourself." );
                return 0;
            else
                SendSysMessage( who, "Yours fingers slip..." );
                CreateItemInBackpack( who, 0x0e20, 1 );
                vital := AP_GetVital( who, HITS );
            endif
        endif
    endwhile

    var current_poison := CInt( GetObjProperty( who, "#PoisonedLevel" ));
    if( !current_poison )
        SendSysMessage( who, "That is not poisoned." );
        return 0;
    endif
        
    var bonus := CInt( GetMobileProtection( who, "HealingIncrease" ));
    if( bonus )
        bonus := CInt( bonus * 5 );
    endif
        
    var difficulty := CInt(( current_poison * 25 ) + 15 ),
    healing := AP_GetSkill( who, HEALING );

    if( SkillCheck( who, HEALING, CInt( difficulty )) > 0 || healing >= CInt( difficulty - bonus ))

        SendSysMessage( who, "You cured level "+current_poison+" poison." );
        TS_LowerDuration( who, "DefaultPoison", -1 );
                
    else
        SendSysMessage( who, "You couldn't cure yourself!" );
    endif
        
    CreateItemInBackpack( who, 0x0e20, 2 );

    return 1;
endfunction

function HealPatient( who, bandage )

    var max_vital := AP_GetStat( who, STRENGTH ),
    vital := AP_GetVital( who, HITS );
    
    if( CInt( vital ) >= CInt( max_vital ))
           SendSysMessage( who, "This patient don't have a bruise!" );
        return 0;
    elseif( !SubtractAmount( bandage, 1 ))
        SendSysMessage( who, "You don't have enough bandages." );
        return 0;
    else
        SendSysMessage( who, "You start to heal yourself." );
    endif
            
    var delay := 7;
    while( Cint( delay ))
        Sleep( 1 );
        delay -= 1;
        
        if( CInt( vital ) >= CInt( max_vital ))
            SendSysMessage( who, "This patient don't have a bruise!" );
            return 0;
        elseif( AP_GetVital( who, HITS ) < vital )
            if( !SubtractAmount( bandage, 1 ))
                SendSysMessage( who, "You don't have enough bandages." );
                SendSysMessage( who, "You couldn't heal yourself." );
                return 0;
            else
                SendSysMessage( who, "Yours fingers slip..." );
                CreateItemInBackpack( who, 0x0e20, 1 );
                vital := AP_GetVital( who, HITS );
            endif
        endif
    endwhile
        
        var difficulty := CInt( AP_GetStat( who, STRENGTH ) - AP_GetVital( who, HITS ));
        if( difficulty > 65 )
                difficulty := 65;
        endif

        if( SkillCheck( who, HEALING, difficulty ) > 0 )
        
            var heal := HL_GetAmount( who );
            SendSysMessage( who, "You heal "+heal+" damages." );
            HealDamage( who, heal );
        else
            SendSysMessage( who, "You couldn't heal yourself." );
        endif
        
        CreateItemInBackpack( who, 0x0e20, 1 );
    
    return 1;
    
endfunction

function HL_GetAmount( who )

    var heal_skill := CInt( AP_GetSkill( who, HEALING ) / 10 );
    var anat_skill := CInt( AP_GetSkill( who, ANATOMY ) / 15 );

        var heal := RandomDiceRoll( CInt( heal_skill )+"d4+"+CInt( heal_skill )) + RandomDiceRoll( "1d8+2" ) + CInt( anat_skill );

        var bonus := CInt( GetMobileProtection( who, "HealingIncrease" ));
    if( bonus )
        heal *= CDbl(( bonus * 0.1 ) + 1 );
    endif

        if( GetObjProperty( who, WARRIOR ))
                heal *= ClasseBonus( who, WARRIOR );
        endif
        
        return CInt( heal );
endfunction
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 7.11.2014, 22:58
Сообщение #16


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



Молодец, быстро учишься (IMG:style_emoticons/default/smile.gif)

Следующая твоя задача, вынести функционал, который используют оба скрипта хила, в отдельный инклуд, чтобы потом изменять код только в одном месте, а не править оба скрипта при каких-либо изменениях.

Сообщение отредактировал RL_ka - 7.11.2014, 23:00
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PolDev
сообщение 12.11.2014, 21:44
Сообщение #17


****

Группа: Пользователи
Наличность: 0
Пользователь №: 14.164
Возраст: 22



Цитата
который используют оба скрипта хила

А что за два скрипта? А то я не уловил ))


--------------------
Оказываю услуги по скриптингу Pol серверов.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 13.11.2014, 12:05
Сообщение #18


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



Цитата(PolDev @ 12.11.2014, 19:44) *

А что за два скрипта? А то я не уловил ))


обычный хил бинтом и текстовая команда

Сообщение отредактировал RL_ka - 13.11.2014, 12:05
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 19.4.2024, 4:23
Designed by Nickostyle