You are not logged in.
(Не решенные вопросы внизу (последний пост))
Мой первый скрипт. Если глупые вопросы или просто забыл чего - не ругайтесь, пожалуйста.
Делает скрипт следующее:
если подойти к больнице, появится доктор (достаточно далеко, чтобы его появления около больницы не было видно), если к нему подойти ближе, он подойдет к игроку и спросит, хотите ли вы "полечится", лечит (ну или не лечит). Если отойти доктор уничтожится.
Реализовано так:
массив заполняю кооринатами медицинских центров
пробегая по массиву, в цикле, проверяю, подошел ли 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
Во-первых - не используй ГЛОБАЛЬНЫХ переменных в CLEO - скрипте!!! Можно исп. только "специальные", типа $PLAYER_ACTOR.
Имя FXT-файла любое. Указывать на файл нигде не нужно. Но лучше юзай опкоды 0ACA-0AD1.
Проверка нажатия кнопки - 0AB0.


Offline
Примерно так. Учись конструкциями писать.
{$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@ = marker.CreateIconWithoutSphere(22, 6@(5@,5f), 12@(5@,5f), 18@(5@,5f))
после условия "подхода"
Offline
А. я, кажется, понял. Создав глобальные переменные моих иконок, я их поместил на карту навсегда. Они оставались, даже, когда я убрал скрипт.
я их выключил
не. не выключил. они почему то так и висят на карте. что делать?
Last edited by ChCyrill (30-08-2011 14:25)
Offline
Новую игру начни.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
я лучше в скрипте напишу отключение иконок
Большое спасибо за помощь. Переписал свой скрипт, используя совет и ваш код (новые конструкции и опкоды узнал) - вроде все работает.
Я наоборот разучался конструкциями писать (я программирую). Думал тут (в скриптах) их лучше не использовать.
И еще вопрос. По fxt (CLEO_TEXT). Все таки хочу его использовать. Я переименовал запись (строку), по примеру другого скрипта, в SPD_1. Заработало. Для имен строк есть какие-нибудь правила?
Last edited by ChCyrill (30-08-2011 17:03)
Offline
Раз моя тема все еще первая и просмотров много.
Как "правильно" вызвать актера в машине к CJю. Чтобы он приехал, а не вдруг появился, и чтобы на дороге.
А именно - теперь я хочу вызвать доктора. Он должен подъехать ко мне, как он подъезжает, когда на улице умирают.
P.S. про текст никто не может ответить?
Offline
Блин. Что-то застреваю я в скриптинге на каждом шагу.
Не проигрывается анимация. 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
Вместо actor -1 надо указывать $PLAYER_ACTOR и вместо -1ms надо нормальное время.
Offline
Спасибо
Актер у меня правильно стоит, я просто из примера в справке копировал, а не из кода.
А вот время я -1 оставил. Поставил другое - заработало.
Offline
Как можно узнать, что игрок кого-то (актера) убил?
конкретного и любого (неизвестного, просто педа на улице)
Last edited by ChCyrill (01-09-2011 16:27)
Offline
если всё ещё интересно, то вот:
0xB6F3B8 = Поинтер на цель.
+0xC0 = Поинтер на последний объект, педа, машину с которым ты столкнулся.
переходи на адрес из указателя и проверяй пед-ли это, а если пед - то умер-ли он.
на форуме есть примеры использования адресов памяти и работы с ними.
Offline
Еще интересно, но сейчас не попробую. 
Спасибо.
Offline