Доброго времени суток, форумчане.
Поставил себе задачу сделать следующую функцию:
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
не совсем понял что значит "Меня интересует, как сделать, чтобы каждые +5 часов, чару выдавался сувенир не прибегая к"
как это не прибегая? ты хочешь чтобы твой скрипт просто работал в цикле с периодичностью 5 часов?
while (1)
тут делаем всё что угодно
sleep(60*60*5); 60сек*60мин*5
endwhile
RL_ka, скрипт должен работать следующим образом:
Чар сидит в онлайне, ему каждый раз суммируется проперти
"onlinetimer", которое означает общее количество времени (секунд) онлайна.
С помощью этого проперти, мы выявляем, сколько часов он находится в онлайне. - это всё есть, но, нет следующего:
Выявив 5 часов его онлайна, мы дарим ему сувенир.
Если он 10 часов онлайна, мы дарим ему еще один сувенир
И так далее, каждые 5 часов ЕГО онлайна.
Я попробовал тот код, что я написал - он действует, но, я не хочу его использовать т.к. здесь нужно будет прописывать бесконечное количество времени (5, 10, 15, 20 и т.д. ) с такой огромной писаниной текста.
Я хочу обойти, подразумевая какой-то другой выход из этой ситуации..
Так ведь тогда это будет простейший скрипт
while (1)
sleep(60*60*5);
create_zm := CreateItemInBackpack( who, "СУВЕНИР", 1);
SendSysMessage( who, "бла-бла-бла", 3, 55 );
endwhile
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
А как к этому всему добавить проверку на количество прожитого времени чара в онлайне? В данном случае 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
для чего?
скрипт запускается после входа в игру, спит 5 часов, создаёт предмет, спит опять 5 часов.
зачем ему проверять время, если он срабатывает сам по себе каждые 5 часов после входа персонажа в игру?
если тебе проверка нужна для чего-то другого - объясни для чего тогда
Чар зашел в игру, получил свой сувенир и вышел.
Через 5 часов он опять зашел и опять получил... и так до бесконечности. Здесь смысла нет.
Моя идея в следующем:
Чар должен простоять 5 часов онлайна (сразу, или постепенно), чтобы получить сувенир.
Следующий сувенир должен даваться на отметке 10 часов, следующий в 15 и т.п. )
RL_ka, а как мне привязать его к общему счетчику времени в онлайне?
п.с. протестировал тот кусочек. Сразу при входе в игру, начинается дикий флуд
бла-бла-бла
И никаких задержак не происходит..
К сожалению с while не дружу, если бы знал, исправил сам и не сообщал об этом, но увы..
Я тебе со всей уверенностью говорю что мой скрипт делает прямо то что ты хочешь. Покажи полную версию своего скрипта сейчас и тот флуд
Это простой, лёгкий скрипт в котором по идее не нужно ничего городить со временем, так что надо заставить его работать
Вот скрипт:
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!!!
Так у тебя он почему спит то 15 секунд, а не new_sleep
Это я ставил специально, чтобы посмотреть, изменится ли что-либо!
Ничего не изменилось, он каждую секунду "создаёт" медали и чар зависает.
А, все понятно. Logon это критический скрипт, в нем все задержки минимальны.
Тебе нужно твой скрипт переименовать в souvenir.src а в твоём logon.src написать всего одну строчку: start_script(":pkgname:souvenir.src", who)
В своем исходнике, ты написал:
i ++;
Это правильно?
т.к. компилятор 099 ядра не хочет его компилировать, пишет:
Unbalanced binary operator: +
Убрал пробел, та же самая ситуация..
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
Параметры в скрипт нужно передать массивом. Буду дома - объясню, сейчас с телефона не удобно
Собрал тебе пакет, всё проверено, всё работает.
Разархивировать в папку pkg и компилировать оба скрипта.
После входа чара отсчитывает 5 часов и выдаёт вещь, и так покругу пока чар онлайн.
Удачи
Прикрепленные файлы
souvenirs.zip ( 1,16 килобайт )
Кол-во скачиваний: 174
RL_ka, благодарю тебя за помощь.
Всё работает как новые часы! : )
Вот, перечитай всё несколько разиков чтобы понять точно как работает
Да, уже проанализировал.
Скажи пожалуйста, я знаю что разработчики убрали из сервера:
SYSFIND_SEARCH_STORAGE_AREAS
А на что теперь её заменить?
И можно ли её вообще отдельной константой себе в инклуд прикрепить как она раньше была
const SYSFIND_SEARCH_STORAGE_AREAS := 2
Будет ли она работать?
А для чего он тебе вообще сдался то?
Его убрали потому что им никто вообще не пользовался и в нём не было необходимости
Дело в том, что я использую некоторые скрипты с 097 пола и там это присутствует. Теперь не знаю как быть)
Просто удалить парметр и использовать SystemFindObjectBySerial( serial )
ничего не изменится
RL_ka, понял, благодарю.
Если на чара зациклить скрипт, то он при логауте чара не выключится, можете проверить сами, выводя сообщения в лог сервера...
Лучше добавить банальную проверку:
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
Нет особой необходимости. CreateItemImBackpack вернет ошибку если чар вышел из игры и скрипт выключится
Да, но он сможет быть оффлайн до момента выдачи приза, а потом зайти перед выдачей...
Я именно такой глупой проверкой его исправил у себя )
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)