Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ POL _ Требуется помощь..

Автор: oda128 23.11.2013, 2:53

Доброго времени суток, форумчане.
Поставил себе задачу сделать следующую функцию:

Код

    Var Seconds := GetObjProperty( who, "onlinetimer" );

    Var Days;
    Var Hours;
    Var Minutes;

    //CalculateUpTime( Seconds, Days, Hours, Minutes );

    CalculateUpTime ( Seconds, Days, Hours, Minutes );

    If( !Seconds )
    Minutes := 0;
    Hours   := 0;
    Days    := 0;
    Endif

    var i;
    var create_zm;

  If( !GetObjProperty( who, "@Recieved" ) )
    if( Hours >= 5 )
//        for (i := Hours; i <= Hours; i := i + i)
    create_zm := CreateItemInBackpack( who, "СУВЕНИР", 1);
    SendSysMessage( who, "бла-бла-бла", 3, 55 );
    SetObjProperty( who, "@Recieved", 1 );
    print( "Recieved 1" );
//    endfor
    endif
  elseIf( GetObjProperty( who, "@Recieved" ) == 1 )
    if( Hours >= 10 )
//        for (i := Hours; i <= Hours; i := i + i)
    create_zm := CreateItemInBackpack( who, "СУВЕНИР", 1);
    SendSysMessage( who, "бла-бла-бла", 3, 55 );
    SetObjProperty( who, "@Recieved", 2 );
    print( "Recieved 2" );
//    endfor
    endif
  elseIf( GetObjProperty( who, "@Recieved" ) == 2 )
    if( Hours >= 15 )
//        for (i := Hours; i <= Hours; i := i + i)
    create_zm := CreateItemInBackpack( who, "СУВЕНИР", 1);
    SendSysMessage( who, "бла-бла-бла", 3, 55 );
    SetObjProperty( who, "@Recieved", 3 );
    print( "Recieved 3" );
//    endfor
    endif
endif


Как вы видите, данный кусок содержит следующее:
Если у чара нет проперти "@Recieved" и если его онлайн больше или равен 5 часам, мы дарим ему "СУВЕНИР".

Меня интересует, как сделать, чтобы каждые +5 часов, чару выдавался сувенир не прибегая к
elseif( GetObjProperty( who, "@Recieved" ) == 2 )
if( Hours >= 15 )
и т.п.

Ведь если таким образом прописать 500 часов онлайна - это во-первых огромный флуд, во-вторых геморой и нагрузка на скрипт.
Возможно ли это сделать с помощью for ? Если да, то пожалуйста, не затруднитесь и напишите мне этот кусок т.к. с фор не дружу..

Или может быть с case? Кто знает, подскажите как написать это...

С уважением.

Автор: RL_ka 23.11.2013, 16:26

не совсем понял что значит "Меня интересует, как сделать, чтобы каждые +5 часов, чару выдавался сувенир не прибегая к"

как это не прибегая? ты хочешь чтобы твой скрипт просто работал в цикле с периодичностью 5 часов?

Код

while (1)
    тут делаем всё что угодно
    sleep(60*60*5); 60сек*60мин*5
endwhile


Опиши полностью как должен работать скрипт по твоей задумке

Автор: oda128 23.11.2013, 17:17

RL_ka, скрипт должен работать следующим образом:

Чар сидит в онлайне, ему каждый раз суммируется проперти
"onlinetimer", которое означает общее количество времени (секунд) онлайна.
С помощью этого проперти, мы выявляем, сколько часов он находится в онлайне. - это всё есть, но, нет следующего:

Выявив 5 часов его онлайна, мы дарим ему сувенир.
Если он 10 часов онлайна, мы дарим ему еще один сувенир
И так далее, каждые 5 часов ЕГО онлайна.

Я попробовал тот код, что я написал - он действует, но, я не хочу его использовать т.к. здесь нужно будет прописывать бесконечное количество времени (5, 10, 15, 20 и т.д. ) с такой огромной писаниной текста.
Я хочу обойти, подразумевая какой-то другой выход из этой ситуации..

Автор: RL_ka 23.11.2013, 20:18

Так ведь тогда это будет простейший скрипт

Код

while (1)
    sleep(60*60*5);
    create_zm := CreateItemInBackpack( who, "СУВЕНИР", 1);
    SendSysMessage( who, "бла-бла-бла", 3, 55 );
endwhile


считать время онлайн вообще не нужно так как мы будем просто после входа спать 5 часов, а затем создавать предмет, затем снова спать 5 часов и создавать предмет...
Естественно это должен быть скрипт logon


Опционально, если нужно знать сколько сувениров уже было получено, можно добавить счётчик

Код

var i:=0;
setobjproperty(who, "@Recieved", i);
while (1)
    sleep(60*60*5);
    create_zm := CreateItemInBackpack( who, "СУВЕНИР", 1);
    SendSysMessage( who, "бла-бла-бла", 3, 55 );
    i++;
    setobjproperty(who, "@Recieved", i);
endwhile

Автор: oda128 23.11.2013, 21:11

А как к этому всему добавить проверку на количество прожитого времени чара в онлайне? В данном случае Hours

Код

Var Seconds := GetObjProperty( who, "onlinetimer" );

    Var Days;
    Var Hours;
    Var Minutes;

    //CalculateUpTime( Seconds, Days, Hours, Minutes );

    CalculateUpTime ( Seconds, Days, Hours, Minutes );

    If( !Seconds )
    Minutes := 0;
    Hours   := 0;
    Days    := 0;
    Endif



if( Hours >= 5 ) - проверка, если 5 или больше часов чар был в онлайн.
if( Hours >= 10 ) и т.д. и т.п.

Как бы это использовать вместо if совместно с вышенаписанным твоим кодом?

Автор: RL_ka 23.11.2013, 21:29

для чего?
скрипт запускается после входа в игру, спит 5 часов, создаёт предмет, спит опять 5 часов.
зачем ему проверять время, если он срабатывает сам по себе каждые 5 часов после входа персонажа в игру?

если тебе проверка нужна для чего-то другого - объясни для чего тогдаsmile.gif

Автор: oda128 23.11.2013, 21:32

Чар зашел в игру, получил свой сувенир и вышел.
Через 5 часов он опять зашел и опять получил... и так до бесконечности. Здесь смысла нет.

Моя идея в следующем:
Чар должен простоять 5 часов онлайна (сразу, или постепенно), чтобы получить сувенир.
Следующий сувенир должен даваться на отметке 10 часов, следующий в 15 и т.п. )

Автор: RL_ka 23.11.2013, 21:49

Цитата(oda128 @ 23.11.2013, 19:32) *

Чар зашел в игру, получил свой сувенир и вышел.
Через 5 часов он опять зашел и опять получил... и так до бесконечности. Здесь смысла нет.

Моя идея в следующем:
Чар должен простоять 5 часов онлайна (сразу, или постепенно), чтобы получить сувенир.
Следующий сувенир должен даваться на отметке 10 часов, следующий в 15 и т.п. )


Ты внимательно посмотри на скрипт, подарок выдаётся не сразу как он зашел в игру, а после 5 часов работы скрипта. Сразу после входа в игру запускается скрипт, и он начинается с задержки в 5 часоа

Автор: oda128 23.11.2013, 21:52

RL_ka, а как мне привязать его к общему счетчику времени в онлайне?

п.с. протестировал тот кусочек. Сразу при входе в игру, начинается дикий флуд
бла-бла-бла
И никаких задержак не происходит..

К сожалению с while не дружу, если бы знал, исправил сам и не сообщал об этом, но увы..

Автор: RL_ka 23.11.2013, 21:59

Я тебе со всей уверенностью говорю что мой скрипт делает прямо то что ты хочешь. Покажи полную версию своего скрипта сейчас и тот флуд

Это простой, лёгкий скрипт в котором по идее не нужно ничего городить со временем, так что надо заставить его работатьsmile.gif

Автор: oda128 23.11.2013, 22:31

Вот скрипт:
logon.src

Код
use os;
use uo;

program CheckHour( who )


        var i:=0;
        var create_hm;
        var new_sleep := CInt( 60*60*5 );
//        Var players := EnumerateOnlineCharacters();
        
            setobjproperty(who, "@Recieved", i);
            
        while (1)
        sleep( 15 );
//            Foreach chr in players
            
            create_hm := CreateItemInBackpack( who, "houredal" , 1);
            SendSysMessage( who, "You have recieved Hour Medal!", 3, 55 );
            i := i+1;
            setobjproperty( who, "@Recieved", i);
            print( "CheckHour: Hour Medal Recieved!!!" );
            
//            Endforeach
            
        endwhile


endprogram


Чар заходит в игру и в консоле поехало:

Код

CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!
CheckHour: Hour Medal Recieved!!!


Тоже самое пишется игроку, который не может двигаться и зависает.

Автор: RL_ka 23.11.2013, 22:40

Так у тебя он почему спит то 15 секунд, а не new_sleep

Автор: oda128 23.11.2013, 22:42

Это я ставил специально, чтобы посмотреть, изменится ли что-либо!
Ничего не изменилось, он каждую секунду "создаёт" медали и чар зависает.

Автор: RL_ka 23.11.2013, 22:46

А, все понятно. Logon это критический скрипт, в нем все задержки минимальны.
Тебе нужно твой скрипт переименовать в souvenir.src а в твоём logon.src написать всего одну строчку: start_script(":pkgname:souvenir.src", who)

Автор: oda128 23.11.2013, 22:53

В своем исходнике, ты написал:
i ++;
Это правильно?
т.к. компилятор 099 ядра не хочет его компилировать, пишет:

Unbalanced binary operator: +

Автор: RL_ka 23.11.2013, 22:54

Цитата(oda128 @ 23.11.2013, 20:53) *

В своем исходнике, ты написал:
i ++;
Это правильно?
т.к. компилятор 099 ядра не хочет его компилировать, пишет:

Unbalanced binary operator: +


Без пробела нужно
Это эквивалент i=:i+1, только удобнееsmile.gif

Автор: oda128 23.11.2013, 23:01

Убрал пробел, та же самая ситуация..

Цитата(RL_ka @ 23.11.2013, 21:46) *

А, все понятно. Logon это критический скрипт, в нем все задержки минимальны.
Тебе нужно твой скрипт переименовать в souvenir.src а в твоём logon.src написать всего одну строчку: start_script(":pkgname:souvenir.src", who)


В этом варианте, нормализовался запуск через 15 секунд (или любое другое количество), но он ничего не создаёт в бекпеке чара и ничего не пишет чару.
Пишет только консоль:
CheckHour: Hour Medal Recieved!!!
Код
use os;
use uo;

program CheckHour( who )


        var i:=0;
        var create_hm;
        var new_sleep := CInt( 60*60*5 );
//        Var players := EnumerateOnlineCharacters();
        
            setobjproperty(who, "@Recieved", i);
            
        while (1)
        sleep( 15 );
//            Foreach chr in players

            print( "CheckHour: Hour Medal Recieved!!!" );
            create_hm := CreateItemInBackpack( who, "zulumedal" , 1);
            SendSysMessage( who, "You have recieved Hour Medal!", 3, 55 );
            i := i+1;
            setobjproperty( who, "@Recieved", i);
            
//            Endforeach
            
        endwhile


endprogram

Автор: RL_ka 23.11.2013, 23:21

Параметры в скрипт нужно передать массивом. Буду дома - объясню, сейчас с телефона не удобно

Автор: RL_ka 24.11.2013, 4:24

Собрал тебе пакет, всё проверено, всё работает.
Разархивировать в папку pkg и компилировать оба скрипта.

После входа чара отсчитывает 5 часов и выдаёт вещь, и так покругу пока чар онлайн.

Удачи wink.gif


Прикрепленные файлы
Прикрепленный файл  souvenirs.zip ( 1,16 килобайт ) Кол-во скачиваний: 174

Автор: oda128 24.11.2013, 18:00

RL_ka, благодарю тебя за помощь.
Всё работает как новые часы! : )

Автор: RL_ka 25.11.2013, 3:38

Вот, перечитай всё несколько разиков чтобы понять точно как работает smile.gif

Автор: oda128 25.11.2013, 21:22

Да, уже проанализировал.
Скажи пожалуйста, я знаю что разработчики убрали из сервера:
SYSFIND_SEARCH_STORAGE_AREAS

А на что теперь её заменить?

И можно ли её вообще отдельной константой себе в инклуд прикрепить как она раньше была
const SYSFIND_SEARCH_STORAGE_AREAS := 2

Будет ли она работать?

Автор: RL_ka 25.11.2013, 21:39

А для чего он тебе вообще сдался то? blink.gif
Его убрали потому что им никто вообще не пользовался и в нём не было необходимости

Автор: oda128 25.11.2013, 23:33

Дело в том, что я использую некоторые скрипты с 097 пола и там это присутствует. Теперь не знаю как быть)

Автор: RL_ka 26.11.2013, 0:00

Просто удалить парметр и использовать SystemFindObjectBySerial( serial )
ничего не изменится

Автор: oda128 26.11.2013, 14:37

RL_ka, понял, благодарю.

Автор: PolDev 27.11.2013, 17:30

Если на чара зациклить скрипт, то он при логауте чара не выключится, можете проверить сами, выводя сообщения в лог сервера...
Лучше добавить банальную проверку:

Код
if (!who)
return;
endif



Вот так будет выглядеть скрипт:

Код
use os;
use uo;

const delay := 18000; // 5 hours
const SouvenirType := "zulumedal";
const amount := 1;

program CheckHour( who )

    var i:=0;
    var create_hm;
    setobjproperty(who, "@Recieved", i);
    while (who)
        sleep( delay );
                if (!who)
                return;
                endif
        create_hm := CreateItemInBackpack( who, SouvenirType , amount);
        if( create_hm.errortext )
            return 0;
        endif
        SendSysMessage( who, "You have recieved Hour Medal!", 3, 55 );
        i+=1;
        setobjproperty( who, "@Recieved", i);
    endwhile

endprogram

Автор: RL_ka 28.11.2013, 11:56

Нет особой необходимости. CreateItemImBackpack вернет ошибку если чар вышел из игры и скрипт выключится

Автор: PolDev 8.12.2013, 19:20

Да, но он сможет быть оффлайн до момента выдачи приза, а потом зайти перед выдачей...

Автор: RL_ka 9.12.2013, 16:10

Цитата(PolDev @ 8.12.2013, 17:20) *

Да, но он сможет быть оффлайн до момента выдачи приза, а потом зайти перед выдачей...


Не могу не согласиться, баг присутствует.
Правда я не совсем уверен что твоя проверка его исправит, но в любом случае нужно проверитьsmile.gif

Автор: PolDev 20.12.2013, 9:12

Я именно такой глупой проверкой его исправил у себя )

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)