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

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> Требуется помощь..
oda128
сообщение 23.11.2013, 2:53
Сообщение #1


***

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



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

    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? Кто знает, подскажите как написать это...

С уважением.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 23.11.2013, 16:26
Сообщение #2


*****

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



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

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

Код

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


Опиши полностью как должен работать скрипт по твоей задумке
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 23.11.2013, 17:17
Сообщение #3


***

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



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

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

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

Я попробовал тот код, что я написал - он действует, но, я не хочу его использовать т.к. здесь нужно будет прописывать бесконечное количество времени (5, 10, 15, 20 и т.д. ) с такой огромной писаниной текста.
Я хочу обойти, подразумевая какой-то другой выход из этой ситуации..
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 23.11.2013, 20:18
Сообщение #4


*****

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



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

Код

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 23.11.2013, 21:11
Сообщение #5


***

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



А как к этому всему добавить проверку на количество прожитого времени чара в онлайне? В данном случае 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 совместно с вышенаписанным твоим кодом?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 23.11.2013, 21:29
Сообщение #6


*****

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



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

если тебе проверка нужна для чего-то другого - объясни для чего тогда(IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 23.11.2013, 21:32
Сообщение #7


***

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



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

Моя идея в следующем:
Чар должен простоять 5 часов онлайна (сразу, или постепенно), чтобы получить сувенир.
Следующий сувенир должен даваться на отметке 10 часов, следующий в 15 и т.п. )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 23.11.2013, 21:49
Сообщение #8


*****

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



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

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

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


Ты внимательно посмотри на скрипт, подарок выдаётся не сразу как он зашел в игру, а после 5 часов работы скрипта. Сразу после входа в игру запускается скрипт, и он начинается с задержки в 5 часоа
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 23.11.2013, 21:52
Сообщение #9


***

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



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

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

К сожалению с while не дружу, если бы знал, исправил сам и не сообщал об этом, но увы..
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 23.11.2013, 21:59
Сообщение #10


*****

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



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

Это простой, лёгкий скрипт в котором по идее не нужно ничего городить со временем, так что надо заставить его работать(IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 23.11.2013, 22:31
Сообщение #11


***

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



Вот скрипт:
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!!!


Тоже самое пишется игроку, который не может двигаться и зависает.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 23.11.2013, 22:40
Сообщение #12


*****

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



Так у тебя он почему спит то 15 секунд, а не new_sleep
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 23.11.2013, 22:42
Сообщение #13


***

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



Это я ставил специально, чтобы посмотреть, изменится ли что-либо!
Ничего не изменилось, он каждую секунду "создаёт" медали и чар зависает.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 23.11.2013, 22:46
Сообщение #14


*****

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



А, все понятно. Logon это критический скрипт, в нем все задержки минимальны.
Тебе нужно твой скрипт переименовать в souvenir.src а в твоём logon.src написать всего одну строчку: start_script(":pkgname:souvenir.src", who)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 23.11.2013, 22:53
Сообщение #15


***

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



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

Unbalanced binary operator: +
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 23.11.2013, 22:54
Сообщение #16


*****

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



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

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

Unbalanced binary operator: +


Без пробела нужно
Это эквивалент i=:i+1, только удобнее(IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 23.11.2013, 23:01
Сообщение #17


***

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



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

Цитата(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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 23.11.2013, 23:21
Сообщение #18


*****

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



Параметры в скрипт нужно передать массивом. Буду дома - объясню, сейчас с телефона не удобно
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 24.11.2013, 4:24
Сообщение #19


*****

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



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

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

Удачи (IMG:style_emoticons/default/wink.gif)


Прикрепленные файлы
Прикрепленный файл  souvenirs.zip ( 1,16 килобайт ) Кол-во скачиваний: 174
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 24.11.2013, 18:00
Сообщение #20


***

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



RL_ka, благодарю тебя за помощь.
Всё работает как новые часы! : )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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