#1 29-08-2011 23:18

ChCyrill
Registered: 28-08-2011
Posts: 11

Несколько (много) вопросов по первому скрипту. Актер

(Не решенные вопросы внизу (последний пост))
Мой первый скрипт. Если глупые вопросы или просто забыл чего - не ругайтесь, пожалуйста.

Делает скрипт следующее:
если подойти к больнице, появится доктор (достаточно далеко, чтобы его появления около больницы не было видно), если к нему подойти ближе, он подойдет к игроку и спросит, хотите ли вы "полечится", лечит (ну или не лечит). Если отойти доктор уничтожится.

Реализовано так:
массив заполняю кооринатами медицинских центров
пробегая по массиву, в цикле, проверяю, подошел ли CJ к центру
если подошел - сохраняю индексы
создаю доктора
проверяю, подошел ли CJ ближе. одновременно проверяю - если отойдет дальше - уничтожаю доктора
если подошел, доктор бежит к CJ
добежав и остановившись, доктор задает вопрос
CJ отвечает или уходит
если отвечает, доктор его "лечит" и возвращается к месту, на котором появлялся

Ошибки такие:
(решен)1) если CJ подходит к доктору, он не подходит к нему, а сразу лечит и все (но поворачивается к нему)
(решен)2) лечит сразу. а должен был подождать нажатия кнопки

И вопросы:
(решен)1) наверно, это особенность опкода (00EC: actor $PLAYER_ACTOR 0 near_point 6@[3@] 6@[4@] 6@[5@] radius 50.0 50.0).
Для быстрого тестирования у меня больница около дома, там есть навес, как только я под него захожу - доктор пропадает (хотя расстояние там много меньше указанного для уничтожения доктора)
2) как сделать, чтобы на экране появлялся вопрос (текст)? используя CLEO_TEXT, fxt
как назвать текстовый файл? и где то же его нужно указать, наверно, в скрипте?
3) в одной из версий я не делал массив, а поставил в ряд семь условий и семь jump (каждый к своему центру, после jump в переменные заносились координаты нужного центра (здесь заносятся только индексы)). в остальном тоже самое. игра сильно тормозила. семь условий нахождения в сфере подряд - это так тяжело?

Last edited by ChCyrill (01-09-2011 16:28)

Offline

#2 30-08-2011 09:30

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Несколько (много) вопросов по первому скрипту. Актер

Во-первых - не используй ГЛОБАЛЬНЫХ переменных в CLEO - скрипте!!! Можно исп. только "специальные", типа $PLAYER_ACTOR.
Имя FXT-файла любое. Указывать на файл нигде не нужно. Но лучше юзай опкоды 0ACA-0AD1.
Проверка нажатия кнопки - 0AB0.


programmer.png
modder.jpg

Offline

#3 30-08-2011 12:10

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Несколько (много) вопросов по первому скрипту. Актер

Примерно так. Учись конструкциями писать.

{$CLEO .cs}
// 5@ - индекс
6@ = 1577.762
12@ = 1771.0668
18@ = 10.7753
7@ = -316.6812
13@ = 1056.377
19@ = 19.7422
8@ = -2199.7195
14@ = -2308.075
20@ = 30.625
9@ = -1514.823
15@ = 2527.1189
21@ = 55.7444
10@ = -2670.2854
16@ = 616.4364
22@ = 14.4545
11@ = 2027.77
17@ = -1420.52
23@ = 16.9922

while true
    wait 0
    if
        player.Defined(0)
    then
        actor.StorePos($PLAYER_ACTOR, 24@, 25@, 26@)
        for 5@ = 0 to 5
            050A: 27@ = distance_between_XYZ 24@ 25@ 26@ and_XYZ 6@(5@,5f) 12@(5@,5f) 18@(5@,5f)
            if
                27@ < 50.0
            then
                4@ = marker.CreateIconWithoutSphere(22, 6@(5@,5f), 12@(5@,5f), 18@(5@,5f))
                #LAEMT1.Load
                038B: load_requested_models    
                3@ = actor.Create(18, #LAEMT1, 6@(5@,5f), 12@(5@,5f), 18@(5@,5f))
                #LAEMT1.Destroy
                :loop_near
                while true
                    wait 0
                    if or
                        not player.Defined(0)
                        not actor.Defined(3@)
                    then
                        goto @breakinst
                    else 
                        if or
                            actor.Dead($PLAYER_ACTOR)
                            actor.Dead(3@)
                        then
                            goto @breakinst
                        else
                            050A: 27@ = distance_between_XYZ 24@ 25@ 26@ and_XYZ 6@(5@,5f) 12@(5@,5f) 18@(5@,5f)
                            if
                                27@ > 50.0
                            then
                                goto @breakinst
                            else if
                                    00EC: actor $PLAYER_ACTOR 0 near_point 6@(5@,5f) 12@(5@,5f) 18@(5@,5f) radius 3.5 3.5
                                then
                                    camera.Restore_WithJumpCut
                                    player.CanMove(0) = false
                                    04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 1.5 0.0
                                    0637: AS_actor 3@ goto 0@ 1@ 2@ mode 6 turn_radius 0.0 stop_radius 0.0 look_at_actor $PLAYER_ACTOR
                                    while true
                                        wait 0
                                        if or
                                            not player.Defined(0)
                                            not actor.Defined(3@)
                                        then
                                            break
                                        else 
                                            if or
                                                actor.Dead($PLAYER_ACTOR)
                                                actor.Dead(3@)
                                            then
                                                break
                                            else if
                                                    00F2: actor 3@ near_actor $PLAYER_ACTOR radius 2.0 2.0 0
                                                then
                                                    0ACA: show_text_box "Press Y or N"
                                                    while true
                                                        wait 0
                                                        if or                            
                                                            not player.Defined(0)        
                                                            not actor.Defined(3@)        
                                                        then                           
                                                            break                        
                                                        else 
                                                            if or                       
                                                                actor.Dead($PLAYER_ACTOR)
                                                                actor.Dead(3@)           
                                                            then                       
                                                                break                    
                                                            else if
                                                                    00E1: key_pressed 0 11 // Y
                                                                then
                                                                    0A96: 31@ = actor $PLAYER_ACTOR struct                            
                                                                    inc(31@, 0x544)                                                   
                                                                    0A8D: 31@ = read_memory 31@ size 4 virtual_protect 0 // max health
                                                                    0090: 31@ = float 31@ to_integer                                  
                                                                    30@ = actor.Health($PLAYER_ACTOR) 
                                                                    0A8F: 31@ = 31@ - 30@
                                                                    dec(31@)
                                                                    if
                                                                        player.Money(0) > 31@
                                                                    then
                                                                        inc(31@)
                                                                        actor.Health($PLAYER_ACTOR) = 1000
                                                                        0B13: 31@ = NOT 31@ // 31@ = -31@
                                                                        inc(31@)            //
                                                                        player.Money($PLAYER_CHAR) += 31@
                                                                        player.CanMove(0) = true
                                                                        0603: AS_actor 3@ goto 6@(5@,5f) 12@(5@,5f) 18@(5@,5f) mode 6 timelimit -1
                                                                        wait 10000
                                                                        goto @loop_near
                                                                    else
                                                                        0ACA: show_text_box "Show me your money first :trollface:"
                                                                        player.CanMove(0) = true
                                                                        0603: AS_actor 3@ goto 6@(5@,5f) 12@(5@,5f) 18@(5@,5f) mode 6 timelimit -1
                                                                        wait 10000
                                                                        goto @loop_near
                                                                    end
                                                                else if
                                                                        00E1: key_pressed 0 10 // N
                                                                    then
                                                                        player.CanMove(0) = true
                                                                        0603: AS_actor 3@ goto 6@(5@,5f) 12@(5@,5f) 18@(5@,5f) mode 6 timelimit -1
                                                                        wait 10000
                                                                        goto @loop_near
                                                                    end
                                                                end
                                                            end
                                                        end
                                                    end
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end
                    end
                    continue
                    :breakinst
                    if
                        075C: marker 4@ enabled       
                    then
                        marker.Disable(4@)            
                    else if
                            actor.Defined(3@)         
                        then
                            actor.DestroyInstantly(3@)
                        end
                    end
                    while true
                        wait 0
                        if
                            not player.Defined(0)
                        then
                            break
                        else
                            050A: 27@ = distance_between_XYZ 24@ 25@ 26@ and_XYZ 6@(5@,5f) 12@(5@,5f) 18@(5@,5f) 
                            if
                                27@ > 50.0
                            then
                                break
                            end
                        end
                    end
                    break                             
                end
            end
        end
    end
end

Last edited by DK22Pac (30-08-2011 12:38)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#4 30-08-2011 12:49

ChCyrill
Registered: 28-08-2011
Posts: 11

Re: Несколько (много) вопросов по первому скрипту. Актер

Наверно, очень глупый вопрос.
Почему сразу создались все маркеры (иконки)?
Ведь
4@ = marker.CreateIconWithoutSphere(22, 6@(5@,5f), 12@(5@,5f), 18@(5@,5f))
после условия "подхода"

Offline

#5 30-08-2011 14:14

ChCyrill
Registered: 28-08-2011
Posts: 11

Re: Несколько (много) вопросов по первому скрипту. Актер

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

Last edited by ChCyrill (30-08-2011 14:25)

Offline

#6 30-08-2011 15:49

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Несколько (много) вопросов по первому скрипту. Актер

Новую игру начни.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#7 30-08-2011 17:02

ChCyrill
Registered: 28-08-2011
Posts: 11

Re: Несколько (много) вопросов по первому скрипту. Актер

я лучше в скрипте напишу отключение иконок
Большое спасибо за помощь. Переписал свой скрипт, используя совет и ваш код (новые конструкции и опкоды узнал)  - вроде все работает.
smile Я наоборот разучался конструкциями писать (я программирую). Думал тут (в скриптах) их лучше не использовать.

И еще вопрос. По fxt (CLEO_TEXT). Все таки хочу его использовать. Я переименовал запись (строку), по примеру другого скрипта, в SPD_1. Заработало. Для имен строк есть какие-нибудь правила?

Last edited by ChCyrill (30-08-2011 17:03)

Offline

#8 30-08-2011 23:07

ChCyrill
Registered: 28-08-2011
Posts: 11

Re: Несколько (много) вопросов по первому скрипту. Актер

Раз моя тема все еще первая и просмотров много.
Как "правильно" вызвать актера в машине к CJю. Чтобы он приехал, а не вдруг появился, и чтобы на дороге.
А именно - теперь я хочу вызвать доктора. Он должен подъехать ко мне, как он подъезжает, когда на улице умирают.
P.S. про текст никто не может ответить?

Offline

#9 31-08-2011 14:25

ChCyrill
Registered: 28-08-2011
Posts: 11

Re: Несколько (много) вопросов по первому скрипту. Актер

Блин. Что-то застреваю я в скриптинге на каждом шагу.
Не проигрывается анимация. 6@ - мой доктор

04ED: load_animation "POOL"

while 04EE: not animation "POOL" loaded
   wait 10
end

0605: actor 6@ perform_animation_sequence "POOL_LONG_SHOT" from_file "POOL" 4.0 loop 0 0 0 1 -1 ms 

wait 5000

Last edited by ChCyrill (31-08-2011 15:54)

Offline

#10 31-08-2011 15:34

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Несколько (много) вопросов по первому скрипту. Актер

Вместо actor -1 надо указывать $PLAYER_ACTOR и вместо -1ms надо нормальное время.

Offline

#11 31-08-2011 15:56

ChCyrill
Registered: 28-08-2011
Posts: 11

Re: Несколько (много) вопросов по первому скрипту. Актер

Спасибо
Актер у меня правильно стоит, я просто из примера в справке копировал, а не из кода.
А вот время я -1 оставил. Поставил другое - заработало.

Offline

#12 01-09-2011 16:27

ChCyrill
Registered: 28-08-2011
Posts: 11

Re: Несколько (много) вопросов по первому скрипту. Актер

Как можно узнать, что игрок кого-то (актера) убил?
конкретного и любого (неизвестного, просто педа на улице)

Last edited by ChCyrill (01-09-2011 16:27)

Offline

#13 21-09-2011 17:47

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Несколько (много) вопросов по первому скрипту. Актер

если всё ещё интересно, то вот:

0xB6F3B8 = Поинтер на цель.
+0xC0 = Поинтер на последний объект, педа, машину с которым ты столкнулся.

переходи на адрес из указателя и проверяй пед-ли это, а если пед - то умер-ли он.
на форуме есть примеры использования адресов памяти и работы с ними.

Offline

#14 22-09-2011 21:23

ChCyrill
Registered: 28-08-2011
Posts: 11

Re: Несколько (много) вопросов по первому скрипту. Актер

Еще интересно, но сейчас не попробую. sad
Спасибо.

Offline

Board footer

Powered by FluxBB