Всем добра !
Вот еще один скрипт на Сферу 56б
Капча на добычу ресурсов (в данном случае на добычу руды)
При добыче руды, есть шанс что всплывет окно капчи (5%) и игрока замораживает.
Гамп не закрывается и игрок не будет разморожен, пока не ответит. Если игрок ответил неверно или попросту закрыл УО, то на него накладывается штраф в виде заморозки. Если в течении дня несколько неверных ответов, то время наказания (заморозки) растет. Обязательно проверьте чтоб гамп на картинку костей совпадал. В общем пользуйтесь, надеюсь кому-то полезно будет.
Код
[DEFNAME captcha_settings]
CAPTCHA_CHANCE 50 // шанс капчи (50 - 5%)
CAPTCHA_RESET_TIME 864000 // сутки в тиках (86400 сек * 10)
CAPTCHA_PROTECT_MINUTES 15
CAPTCHA_PROTECT_TICKS <EVAL 15 * 60 * 10> // 9000 тиков = 15 минут
[EVENTS e_anti_bot_simple]
ON=@SkillStart
IF (<ACTION> == Skill_Mining)
// Защита 15 минут после успешного прохождения
LOCAL.protect_left = <EVAL <ACCOUNT.TAG0.captcha_protect_end> - <SERV.TIME>>
IF (<LOCAL.protect_left> > 0)
RETURN 0 // Капча не показывается
ENDIF
IF (<EVAL {1 1000}> <= <DEF.CAPTCHA_CHANCE>)
f_captcha_show
RETURN 1
ENDIF
ENDIF
ON=@Login
// Проверяем, заморожен ли игрок
IF (<FLAGS> & statf_freeze) && (<TAG0.freeze_end_time_abs> > 0)
IF (<TAG0.freeze_end_time_abs> > <SERV.TIME>)
LOCAL.TICKS_LEFT = <EVAL (<TAG0.freeze_end_time_abs> - <SERV.TIME>)>
LOCAL.TOTAL_SEC = <EVAL (<LOCAL.TICKS_LEFT> / 10)>
LOCAL.MIN = <EVAL (<LOCAL.TOTAL_SEC> / 60)>
LOCAL.SEC = <EVAL (<LOCAL.TOTAL_SEC> % 60)>
SYSMESSAGE @0021 [CAPTCHA] You refused Capcha last time! You are frozen now!
SYSMESSAGE @0bc Remaining Time: <dLOCAL.MIN> min. <dLOCAL.SEC> sec.
SYSMESSAGE @0ee Use .freeze command to check remaining time.
TIMERF <EVAL (<LOCAL.TICKS_LEFT> / 10)>, f_remove_freeze
ELSE
FLAGS &= ~statf_freeze
TAG0.freeze_end_time_abs = 0
ENDIF
ELSE
TAG0.captcha_active = 0
TAG0.freeze_end_time_abs = 0
ENDIF
[FUNCTION f_captcha_show]
LOCAL.variant = <EVAL {1 30}>
IF <LOCAL.variant> == 1
TAG0.dice1_gump = 11284
TAG0.dice2_gump = 11283
TAG0.dice3_gump = 11281
TAG0.captcha_ans = 11
ELIF <LOCAL.variant> == 2
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11282
TAG0.dice3_gump = 11280
TAG0.captcha_ans = 10
ELIF <LOCAL.variant> == 3
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11282
TAG0.dice3_gump = 11281
TAG0.captcha_ans = 11
ELIF <LOCAL.variant> == 4
TAG0.dice1_gump = 11284
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11283
TAG0.captcha_ans = 15
ELIF <LOCAL.variant> == 5
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11284
TAG0.dice3_gump = 11282
TAG0.captcha_ans = 14
ELIF <LOCAL.variant> == 6
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11280
TAG0.dice3_gump = 11283
TAG0.captcha_ans = 11
ELIF <LOCAL.variant> == 7
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11284
TAG0.captcha_ans = 17
ELIF <LOCAL.variant> == 8
TAG0.dice1_gump = 11281
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11283
TAG0.captcha_ans = 12
ELIF <LOCAL.variant> == 9
TAG0.dice1_gump = 11284
TAG0.dice2_gump = 11284
TAG0.dice3_gump = 11284
TAG0.captcha_ans = 15
ELIF <LOCAL.variant> == 10
TAG0.dice1_gump = 11284
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11281
TAG0.captcha_ans = 13
ELIF <LOCAL.variant> == 11
TAG0.dice1_gump = 11284
TAG0.dice2_gump = 11283
TAG0.dice3_gump = 11280
TAG0.captcha_ans = 10
ELIF <LOCAL.variant> == 12
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11281
TAG0.dice3_gump = 11282
TAG0.captcha_ans = 11
ELIF <LOCAL.variant> == 13
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11282
TAG0.dice3_gump = 11284
TAG0.captcha_ans = 14
ELIF <LOCAL.variant> == 14
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11284
TAG0.dice3_gump = 11281
TAG0.captcha_ans = 13
ELIF <LOCAL.variant> == 15
TAG0.dice1_gump = 11283
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11282
TAG0.captcha_ans = 13
ELIF <LOCAL.variant> == 16
TAG0.dice1_gump = 11281
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11283
TAG0.captcha_ans = 12
ELIF <LOCAL.variant> == 17
TAG0.dice1_gump = 11280
TAG0.dice2_gump = 11284
TAG0.dice3_gump = 11280
TAG0.captcha_ans = 7
ELIF <LOCAL.variant> == 18
TAG0.dice1_gump = 11282
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11281
TAG0.captcha_ans = 11
ELIF <LOCAL.variant> == 19
TAG0.dice1_gump = 11284
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11283
TAG0.captcha_ans = 15
ELIF <LOCAL.variant> == 20
TAG0.dice1_gump = 11284
TAG0.dice2_gump = 11282
TAG0.dice3_gump = 11280
TAG0.captcha_ans = 9
ELIF <LOCAL.variant> == 21
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11284
TAG0.dice3_gump = 11282
TAG0.captcha_ans = 14
ELIF <LOCAL.variant> == 22
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11281
TAG0.dice3_gump = 11284
TAG0.captcha_ans = 13
ELIF <LOCAL.variant> == 23
TAG0.dice1_gump = 11285
TAG0.dice2_gump = 11284
TAG0.dice3_gump = 11283
TAG0.captcha_ans = 15
ELIF <LOCAL.variant> == 24
TAG0.dice1_gump = 11283
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11282
TAG0.captcha_ans = 13
ELIF <LOCAL.variant> == 25
TAG0.dice1_gump = 11281
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11280
TAG0.captcha_ans = 9
ELIF <LOCAL.variant> == 26
TAG0.dice1_gump = 11280
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11280
TAG0.captcha_ans = 8
ELIF <LOCAL.variant> == 27
TAG0.dice1_gump = 11282
TAG0.dice2_gump = 11284
TAG0.dice3_gump = 11281
TAG0.captcha_ans = 10
ELIF <LOCAL.variant> == 28
TAG0.dice1_gump = 11282
TAG0.dice2_gump = 11284
TAG0.dice3_gump = 11281
TAG0.captcha_ans = 10
ELIF <LOCAL.variant> == 29
TAG0.dice1_gump = 11284
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11280
TAG0.captcha_ans = 12
ELIF <LOCAL.variant> == 30
TAG0.dice1_gump = 11280
TAG0.dice2_gump = 11285
TAG0.dice3_gump = 11281
TAG0.captcha_ans = 9
ELSE
TAG0.dice1_gump = 11284
TAG0.dice2_gump = 11283
TAG0.dice3_gump = 11281
TAG0.captcha_ans = 11
ENDIF
TAG0.captcha_active = 1
FLAGS |= statf_freeze
SDIALOG d_captcha_text
[DIALOG d_captcha_text]
150,100
page 0
noclose
nomove
resizepic 0 0 2620 320 220
dtext 20 20 1152 Подтвердите, что вы не бот!
dtext 20 50 1152 Вычислите сумму кубиков:
gumppic 40 80 <TAG0.dice1_gump>
gumppic 130 80 <TAG0.dice2_gump>
gumppic 220 80 <TAG0.dice3_gump>
dtext 20 130 1152 Ответ:
checkertrans 20 155 100 22
dtextentry 22 157 96 20 0fc 1
button 130 155 4023 4025 1 0 1
dtext 160 157 1152
dtext 20 185 0299 Введите ответ и нажмите ОК!
[DIALOG d_captcha_text button]
ON=1
IF (<TAG0.captcha_active> == 1)
IF (<dARGTXT[1]> == <dTAG0.captcha_ans>)
SYSMESSAGE @0044 Correct! You may continue.
// 15-минутная защита
LOCAL.new_protect = <EVAL <SERV.TIME> + 9000>
ACCOUNT.TAG0.captcha_protect_end = <LOCAL.new_protect>
TAG0.captcha_active = 0
FLAGS &= ~statf_freeze
RETURN 1
ELSE
IF (<ISNUM <ARGTXT[1]>>) || (!<ISEMPTY <ARGTXT[1]>>)
SYSMESSAGE @0021 Incorrect!
IF !(<ACCOUNT.TAG0.captcha_last_error_time>)
ACCOUNT.TAG0.captcha_last_error_time = <SERV.TIME>
ENDIF
IF (<EVAL <SERV.TIME> - <ACCOUNT.TAG0.captcha_last_error_time>> > <DEF.CAPTCHA_RESET_TIME>)
ACCOUNT.TAG0.captcha_errors = 0
ENDIF
ACCOUNT.TAG0.captcha_errors += 1
ACCOUNT.TAG0.captcha_last_error_time = <SERV.TIME>
LOCAL.FREEZE_TIME = 3600
IF (<dACCOUNT.TAG0.captcha_errors> == 1)
LOCAL.FREEZE_TIME = 180
ELIF (<dACCOUNT.TAG0.captcha_errors> == 2)
LOCAL.FREEZE_TIME = 900
ENDIF
SYSMESSAGE @0ee [CAPTCHA] Incorrect! Error #<dACCOUNT.TAG0.captcha_errors>.
f_apply_freeze_new <dLOCAL.FREEZE_TIME>
TAG0.captcha_active = 0
RETURN 1
ELSE
SYSMESSAGE @0ee Please enter the answer in the text field!
SDIALOG d_captcha_text
ENDIF
ENDIF
ENDIF
RETURN 1
[FUNCTION f_apply_freeze_new]
FLAGS |= statf_freeze
UPDATE
TAG0.freeze_end_time_abs = <EVAL (<SERV.TIME> + (<ARGS> * 10))>
SYSMESSAGE @0ee You are frozen for <EVAL (<ARGS> / 60)> min.
TIMERF <dARGS>, f_remove_freeze
[FUNCTION f_remove_freeze]
IF !(<FLAGS> & statf_freeze)
RETURN 1
ENDIF
FLAGS &= ~statf_freeze
UPDATE
TAG0.freeze_end_time_abs = 0
SYSMESSAGE @05d1 Time is out. You are unfrozen now.
[PLEVEL 1]
freeze
[FUNCTION freeze]
IF !(<FLAGS> & statf_freeze) || (<dTAG0.freeze_end_time_abs> == 0)
SYSMESSAGE @05d1 You are not frozen now.
RETURN 1
ENDIF
LOCAL.TICKS_LEFT = <EVAL (<dTAG0.freeze_end_time_abs> - <SERV.TIME>)>
IF (<dLOCAL.TICKS_LEFT> <= 0)
SYSMESSAGE @05d1 Freezing time is up, please wait for system update.
RETURN 1
ENDIF
LOCAL.TOTAL_SEC = <EVAL (<dLOCAL.TICKS_LEFT> / 10)>
LOCAL.MIN = <EVAL (<LOCAL.TOTAL_SEC> / 60)>
LOCAL.SEC = <EVAL (<LOCAL.TOTAL_SEC> % 60)>
SYSMESSAGE @0bc Remaining Time: <dLOCAL.MIN> min. <dLOCAL.SEC> sec.
RETURN 1
[eof]