Вопросы по CLEO-скриптингу

RusFatal

Новичок
114
10
В чём ошибка? При вводе команды /text 5 должно в чат вывестись сообщение:
Текст: 5
Текст: 4
Текст: 3
Текст: 2
Текст: 1
Но заместо этого постоянно флудит Текст: 5. Вот код:
CLEO:
{$CLEO .cs}
0000: NOP

while not Samp.Available()
wait 100
end

0B34: samp register_client_command "text" to_label @text

alloc 0@ = 256


while true
wait 0  
if
1@ == 1
then
0B35: samp 0@ = get_last_command_params
chatmsg "Текст: %s" -1 0@
000E: 0@ -= 1
if
0@ == 0
then
1@ = 0
end
end
end


:text
1@ = 1
Samp.CmdRet()
 
Последнее редактирование:

BlackKnigga

Известный
BH Team
922
443
В чём ошибка? При вводе команды /text 5 должно в чат вывестись сообщение:
Текст: 5
Текст: 4
Текст: 3
Текст: 2
Текст: 1
Но заместо этого постоянно флудит Текст: 5. Вот код:
CLEO:
{$CLEO .cs}
0000: NOP

while not Samp.Available()
wait 100
end

0B34: samp register_client_command "text" to_label @text

alloc 0@ = 256


while true
wait 0
if
1@ == 1
then
0B35: samp 0@ = get_last_command_params
chatmsg "Текст: %s" -1 0@
000E: 0@ -= 1
if
0@ == 0
then
1@ = 0
end
end
end


:text
1@ = 1
Samp.CmdRet()
В 0@ указатель а не число, из него нельзя что либо вычитать. Хотя даже если бы там было число, все равно ничего бы не получилось - ты постоянно берешь начальное значение опкодом 0b34.
 

RusFatal

Новичок
114
10
Хм... попробовал юзать опкод 0C1A, но в чат всё-равно флудит, значение не отнимается. Более того если прописать /text 0, в чат будет флудить Текст: 0, хотя по идее при нуле он должен останавливаться:
CLEO:
0B34: samp register_client_command "text" to_label @text

alloc 0@ = 64
alloc 3@ = 256


while true
wait 0 
if
1@ == 1
then
0B35: samp 0@ = get_last_command_params
1@ = 0
5@ = 1
end
if
5@ == 1
then
0C1A: 3@ = atoi 0@
chatmsg "Текст: %d" -1 3@
000E: 3@ -= 1
end
if
3@ == 0
then
5@ = 0
end
end


:text
1@ = 1
Samp.CmdRet()
 

ishi

Известный
493
110
Хм... попробовал юзать опкод 0C1A, но в чат всё-равно флудит, значение не отнимается. Более того если прописать /text 0, в чат будет флудить Текст: 0, хотя по идее при нуле он должен останавливаться:
CLEO:
0B34: samp register_client_command "text" to_label @text

alloc 0@ = 64
alloc 3@ = 256


while true
wait 0
if
1@ == 1
then
0B35: samp 0@ = get_last_command_params
1@ = 0
5@ = 1
end
if
5@ == 1
then
0C1A: 3@ = atoi 0@
chatmsg "Текст: %d" -1 3@
000E: 3@ -= 1
end
if
3@ == 0
then
5@ = 0
end
end


:text
1@ = 1
Samp.CmdRet()
в коде у тебя всё вроде нормально, но я вот думаю, что проблема в преобразовании, что-то с числом происходит, и оно уходит в отрицательное значение. Попробуй вывести значение переменной во время работы скрипта
 

RusFatal

Новичок
114
10
в коде у тебя всё вроде нормально, но я вот думаю, что проблема в преобразовании, что-то с числом происходит, и оно уходит в отрицательное значение. Попробуй вывести значение переменной во время работы скрипта
Хм.... Вот что я сделал:
CLEO:
alloc 0@ = 256
alloc 3@ = 256
 
 
while true
wait 0  
if
1@ == 1
then
0B35: samp 0@ = get_last_command_params
chatmsg "Я запомнил число: %d" -1 0@
1@ = 0
5@ = 1
end
if
5@ == 1
then
0C1A: 3@ = atoi 0@
chatmsg "Я преобразовал число в: %d" -1 3@
000E: 3@ -= 1
5@ = 0
end
end
И вот что получилось при вводе команды /text 5:
fArxJfb.png
 

ishi

Известный
493
110
Хм.... Вот что я сделал:
CLEO:
alloc 0@ = 256
alloc 3@ = 256


while true
wait 0
if
1@ == 1
then
0B35: samp 0@ = get_last_command_params
chatmsg "Я запомнил число: %d" -1 0@
1@ = 0
5@ = 1
end
if
5@ == 1
then
0C1A: 3@ = atoi 0@
chatmsg "Я преобразовал число в: %d" -1 3@
000E: 3@ -= 1
5@ = 0
end
end
И вот что получилось при вводе команды /text 5:
fArxJfb.png
Число воспринимается как есть? Что ты вводил?
и, ещё, ты запоминаешь вообще любой параметр при вводе, а можешь ввести даже букву, и получится белиберда (а то и краш). Было бы не дурно сделать скан стринг, чтобы реагировало лишь на целые числа
по логике, тогда не придётся превращать аску в интежер, а сможешь сразу считать, ну, это должно даже быстрее работать
 
Последнее редактирование:

RusFatal

Новичок
114
10
ты запоминаешь вообще любой параметр при вводе
Я сделаю обработку ошибок, восприниматься будут только числа в некотором диапазоне, так что пока это не так важно.
Число воспринимается как есть? Что ты вводил?
Вводил я команду /text 5, запомнил он число 28094904, но опкодом 0C1A преобразовал в нормальное число (5). Похоже скрипт воспринимает это не как число, а как строку, поэтому скорее всего не получается убавлять от него значения и делать проверку на ноль. Исправить как-то можно без scan string?
 

ishi

Известный
493
110
Попробовал, похоже этот опкод не подойдет к моему скрипту, 000Е отлично работает. Чтож, буду ждать хеноси :help:
Я тебе просто посоветую свой способ поиска косяков: выводи значения всех переменных на экран, попутно со значениями и /или описанием, шо с ними должно происходить. В абсолютном большинстве случаев именно так я находил косяки в работе с переменными (за исключением, естессна, случаев, когда игра крашилась)
Само собой, переменные которые флудят, лучше выводить или через рендер, или через приоритетный текст (чтоб чат не засрали)
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Хм... попробовал юзать опкод 0C1A, но в чат всё-равно флудит, значение не отнимается. Более того если прописать /text 0, в чат будет флудить Текст: 0, хотя по идее при нуле он должен останавливаться:
CLEO:
0B34: samp register_client_command "text" to_label @text

alloc 0@ = 64
alloc 3@ = 256


while true
wait 0
if
1@ == 1
then
0B35: samp 0@ = get_last_command_params
1@ = 0
5@ = 1
end
if
5@ == 1
then
0C1A: 3@ = atoi 0@
chatmsg "Текст: %d" -1 3@
000E: 3@ -= 1
end
if
3@ == 0
then
5@ = 0
end
end


:text
1@ = 1
Samp.CmdRet()

Ты либо проверку числа 3@ добавляй до операции отрицания, либо меняй условие.