You are not logged in.

Здравствуйте скриптеры! Для начала хотел выразить свою благодарность Seemann'у за такой инструмент, как SB а также за такой форум, как этот. Спасибо.
Теперь собственно к делу.
Будучи администратором на одном из серверов SA-MP, задался вопросом чего-либо необычного на серверах, что должно привлечь посетителей, и вот увидел Sanny Builder. Я так понимаю, клео - способ получить "необычное".
Предположим, гл. админ выложит на сайте пак скриптов спицально для данного сервера, которые будут работать на данном сервере. Примеры скриптов: иммунитет к хедшотам(убрать иммунитет), взрыв тачки выстрелом в бак, уменьшение/увеличение дамага от оружия и прочее (по идее можно сколотить отличный рпг мод, где всё это будет в качестве бонусов/наказаний).
Собственно вопрос: возможно ли такое?
А также возникла куча вопросов непосредственно по написанию скрипта. Я в скриптинге шарю маловато (изучил весь хелп SB), при попытке создать что-либо, сплошные вылеты в игре.
{$VERSION 3.1.0027}
{$CLEO .cs}
//-------------MAIN---------------
0000: NOP 
:NONAME_2
wait 0 
if and
   Player.Defined($PLAYER_ACTOR)
0AB0:   key_pressed 6 
0AB0:   key_pressed 11 
else_jump @NONAME_2 
wait 1000 
Actor.Health($PLAYER_ACTOR) = 100
Actor.Armour($PLAYER_ACTOR) = 100
0109: player $PLAYER_CHAR money -= 10000
end_threadПо идее (по идее), должно восстанавливать здоровье и броню игроку, который нажал прицел + Y (у игрока также отнимется $10000). Только не пашет =\
Last edited by dragonforce (30-09-2009 18:41)
Offline
Во-первых, в клео применяется опкод 0A93: вместо end_thread. Но если скрипт зациклен (код выполняется бесконечно), то команда завершения кода не нужна. Во-вторых, проверку существования ГГ всегда пишем отдельно. В-третьих, допускается менять только параметры опкодов (касается 0109, где + был заменен на -).
{$CLEO}
wait 0
while true
    wait 1000
    repeat
        wait 0
    until player.Defined($PLAYER_CHAR) 
    while true
        wait 0
        if and
            0AB0:   key_pressed 8 // "Backspace"
            0AB0:   key_pressed 9 // "Tab"
        then
            break
        end
    end 
    wait 1000 
    Actor.Health($PLAYER_ACTOR) = 100
    Actor.Armour($PLAYER_ACTOR) = 100
    0109: player $PLAYER_CHAR money += -10000
endЕсли пока непривычны конструкции WHILE..END, IF..THEN..END, то скомпилируй и декомпилируй код - конструкции будут заменены метками. Код переделан из одноразового в бесконечный - функцией можно воспользоваться много раз за игру.
Last edited by Den_spb (30-09-2009 22:06)
Offline

Мм... Здорово, спасибо.
Заметил вещь, мне абсолютно не понятную.
Что есть $PLAYER_CHAR и $PLAYER_ACTOR и в чем разница между ними?
Offline
Offline

Den_spb, а вот код также не пашет, как и мой - 0 эффекта, как в SA, так и в MP.
Offline
вы забыли самое главное - в МП нету $PLAYER_ACTOR
надо перед Actor.Health($PLAYER_ACTOR) = 100
поставить 01F5: $PLAYER_ACTOR = get_player_actor $PLAYER_CHAR 
я не спец в МП, но все скрипты под него так пишутся))
GIMS developer
Offline
Den_spb, а вот код также не пашет, как и мой - 0 эффекта, как в SA, так и в MP.
С МП я не работаю. А в СА код не действовал потому, что были введены ошибочные номера кнопок в опкодах 0AB0. Список номеров кнопок для данного опкода можно взять в СБ справке: КЛЕО 3 - Список значений кнопок (столбик decimal)
Last edited by Den_spb (30-09-2009 22:07)
Offline

в МП нету $PLAYER_ACTOR
\
Есть. Я пишу скрипты для мультиплеера и точно знаю. Только лишь там не CJ, а какой-нибудь прохожий. И я никгда не пользовался 01F5.
Offline

GTASA прав. Оказалось, в MP есть $PLAYER_ACTOR.
Den_spb, надо было в key_press юзать другой опкод - 00E1, а также перед клавишей надо было поставить 0 (всё это я узнал, посмотрев халп по SB ещё раз).
То есть код рабочего скрипта:
{$CLEO}
wait 0
while true
    wait 1000
    repeat
        wait 0
    until player.Defined($PLAYER_CHAR) 
    while true
        wait 0
        if and
            00E1:   key_pressed 0 8 // "Backspace"
            00E1:   key_pressed 0 9 // "Tab"
        then
            break
        end
    end 
    wait 1000 
    Actor.Health($PLAYER_ACTOR) = 100
    Actor.Armour($PLAYER_ACTOR) = 100
    0109: player $PLAYER_CHAR money += -10000
end
						Last edited by dragonforce (01-10-2009 09:43)
Offline

3Doomer, здесь как раз то, что нужно.
Новый вопрос: 0446: set_actor $PLAYER_ACTOR immune_to_headshots 0 вообще прокатит? Для MP.
Я пробовал что-то писать, но не выходило.  Immune_to_headshots надо присваивать один раз или постоянно, чтобы работало? То же касается 054A: set_actor $ACTOR_ACTOR immune_to_car_headshots 0 а также 
 02AB: set_actor $PLAYER_ACTOR immunities...
У меня такая идея: когда у игрока осталось 25 хп, в течение 15 секунд его можно будет убить только в голову из огнестрельного оружия или взорвать.
Я не прошу чистый код, я хочу понять сам, так что пожалуйста давайте как можно больше пояснений.
Offline

этот опкод вообще помойму не работает  кто-то там разбирал, ах да, Листенер, ну и вот там чото про то что опкод ничо не делает, имя ему - NOP
 кто-то там разбирал, ах да, Листенер, ну и вот там чото про то что опкод ничо не делает, имя ему - NOP 
100 постов - 27 августа;
Offline

кстати насчёт таймера.
Если мне надо, чтобы работало что-то одно, а потом стало что-то другое через 10 секунд, то можно использовать wait 10000 или есть какой-то более "приспособленный" вариант?
Offline
кстати насчёт таймера.
Если мне надо, чтобы работало что-то одно, а потом стало что-то другое через 10 секунд, то можно использовать wait 10000 или есть какой-то более "приспособленный" вариант?
При использовании wait приостанавливается выполнение всего кода. В тех случаях, когда это не приемлемо, можно использовать таймеры. В одном клео-скрипте можно использовать 2 таймера - это переменные 32@ и 33@. С начала запуска игры, значение, записанное в эти переменные увеличивается с каждой миллисекундой на единицу. Если таймер обнулить, то значение всё равно будет продолжать увеличиваться. Приведу пример: действие 1 выполняется постоянно, действие 2 выполняется через каждые 10 секунд в течение 5 секунд
{$CLEO}
wait 0
while true
    wait 0
    // действие 1
    if
        32@ > 15000
    then
        32@ = 0
    end
    if
        32@ > 10000
    then
        // действие 2
    end
end
						Last edited by Den_spb (01-10-2009 18:06)
Offline

Для чего в САМП защищаться от иммунитетов? Это не МТА. И синхронизация там такая, что если будешь стрелять в голову или в ногу - разницы ноль. В сампе бесполезно.
Offline

Den_spb, "С начала запуска игры"?
Когда игра начинается точно? При появлении игрового мира?
Last edited by dragonforce (02-10-2009 14:56)
Offline

И в MP тоже?
Offline

Я понимаю, что не имеют смысла, но таймер мог быть запущен и так. Вот я убедился в этом) Спасибо-спасибо.
Offline
когда твой перс появляется...
Разве? Вообще-то скрипты включаются в работу еще до создания CJ (неслучайно многие коды начинаются с проверки существования игрока), а вместе с ними должны включаться и таймеры.
Offline

И правда. Вот только вопрос тогда: разве можно сделать что-то не с игроком в мультиплеере?
Хотя программа наверное была изначально предназначена для сингла, и там можно делать тачки, пикапы оружия, ботов...
Так. Видел опкоды типа "убрать текущее оружие", "проверить патроны текущего оружия", а опкод определения ID текущего оружия есть?
Last edited by dragonforce (02-10-2009 22:43)
Offline