[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Игры серии GTA » GTA San Andreas » Вопросы по скриптингу Sanny Builder (Вы можете получить ответы на вопросы по SB)
Вопросы по скриптингу Sanny Builder
wmysterio
Администраторы
Скриптер
22.11.11 21:52
Offline
Если у вас возник вопрос по скриптингу Sanny Builder, обращайтесь! Мы постараемся решить вашу проблему wink Это ещё не значит, что все прям бросятся решать во чтобы то не стало, но ответ вы сможете вы получить как вариант решения или как невозможность или сложность решения.
УВАЖАЕМЫЕ ПОЛЬЗОВАТЕЛИ! ПРОСЬБА КОД СКРИПТОВ ПОМЕЩАТЬ В КОНСТРУКЦИЮ КОДА:

или

Также указывайте полный код скрипта, иначе причина ошибок может быть и не выявлена.
Прикрепления: 0248203.png(0.9 Kb) · 9085525.png(0.2 Kb)

Михан500
Пользователи
10.03.14 20:09
Offline
Мне кто нибудь ответит?

SanKing
Друзья
11.03.14 19:39
Offline
Цитата Михан500 ()
Есть одна проблема:Нужно заставить актера будучи заставленным убить игрока, залазить на препятсвия если они ему встретятся.Я сделал это таким способом - координаты между актером и координаты через 3 метра вперед заносил в переменную, одним оппкодом проверял, есть ли между этими точками коллизия, если есть то я заставлял актера прыгать.Все это работает, но из-за этой проверки игра вылетает примерно минут 10.И это еще зависит от количества потоков, в которых есть эта проверка (больше 10 потоков не выдерживает и вылетает).Почему она вылетает? Может можно как-нибудь по другому заставить актера лазить по стенам кроме оппкода climb?Я вот что заметил, любой актер, добавленный в группу игрока умеет лазать по стенам за игрком.Ну так что, можно как-нибудь решить эту проблему?
078F: AS_actor $PLAYER_ACTOR climb 1 //попробуй это, у меня работает.

Михан500
Пользователи
12.03.14 07:14
Offline
Нет, оно я так и сделал!Просто почему-то из-за проверки вылетает через 10 минут.Код не могу написать... стойте, а можеь это быть из-за того что я ааждыц раз заставляю актера убивать главного героя будучи застааленным это делать?Хотя наврятли.Так есть способ заставить актера лазать, кроме 078F: AS_actor $PLAYER_ACTOR climb 1 ???

SanKing
Друзья
12.03.14 14:51
Offline
05BC: AS_actor -1 jump 1

Михан500
Пользователи
14.03.14 16:48
Offline
Значит нету да?Или сделать через последовательность.Ну ладно...

Добавлено (14.03.14, 14:48)
---------------------------------------------
Просто в игре некоторые актеры умеют лазать сами по себе.


Vital
Модераторы
Скриптер
14.03.14 18:50
Offline
Я думаю, это часть ИИ, например, я делал охранника для игрока, и он умел (немного) преодолевать простые препятствия, тем не менее, сильно умнее он не стал. Но ничего дополнительного я не делал, чтобы он умел перепрыгивать препятствия. Враги, кстати, ни разу не пытались перелезть через заборы, скажем, лишь слегка прыгали, и только.

wmysterio
Администраторы
Скриптер
15.03.14 15:14
Offline
Цитата Михан500 ()
Просто в игре некоторые актеры умеют лазать сами по себе.
По-сути все актёры умеют выполнять практически всё, что и CJ. Игра выполняет нужные действия, если идёт целый ряд положительных обстоятельств.

Если писать всё вручную, то нужно:
1) Точно знать маршрут, по которому будет двигаться жертва эксперимента
2) Делать соответствующие проверки, получать время на анимации
3) Выполнять команды вручную при необходимости

Вот пример пример: актёр будет выскакивать на дом, бежать по зданию, перепрыгивать места, где есть преграды:
Код
0376: 0@ = create_random_actor_at 2422.1372 -1681.6096 13.7918
Actor.Angle(0@) = 95.3654
wait 4000

0615: define_AS_pack_begin 1@
0812: AS_actor -1 perform_animation "run_gang1" IFP "PED" framedelta 4.0 loopA 0 lockX 1 lockY 1 lockF 0 time 830  // versionB
078F: AS_actor -1 climb 1
078F: AS_actor -1 climb 1
0812: AS_actor -1 perform_animation "run_gang1" IFP "PED" framedelta 4.0 loopA 0 lockX 1 lockY 1 lockF 0 time 1050  // versionB
05D4: AS_actor -1 rotate_angle 179.0027
0812: AS_actor -1 perform_animation "run_gang1" IFP "PED" framedelta 4.0 loopA 0 lockX 1 lockY 1 lockF 0 time 200  // versionB
05BC: AS_actor -1 jump 1
0812: AS_actor -1 perform_animation "run_gang1" IFP "PED" framedelta 4.0 loopA 0 lockX 1 lockY 1 lockF 0 time 150  // versionB
0616: define_AS_pack_end 1@

0615: define_AS_pack_begin 2@
078F: AS_actor -1 climb 1
0812: AS_actor -1 perform_animation "run_gang1" IFP "PED" framedelta 4.0 loopA 0 lockX 1 lockY 1 lockF 0 time 700  // versionB
078F: AS_actor -1 climb 1
05D4: AS_actor -1 rotate_angle 268.9302
0812: AS_actor -1 perform_animation "run_gang1" IFP "PED" framedelta 4.0 loopA 0 lockX 1 lockY 1 lockF 0 time 400  // versionB
05D4: AS_actor -1 rotate_angle 181.5094
0812: AS_actor -1 perform_animation "run_gang1" IFP "PED" framedelta 4.0 loopA 0 lockX 1 lockY 1 lockF 0 time 6500  // versionB
0616: define_AS_pack_end 2@

0618: assign_actor 0@ to_AS_pack 1@
repeat
wait 0
until 00EC:   actor 0@ sphere 0 near_point 2408.7776 -1691.8906 radius 1.0 1.0
0618: assign_actor 0@ to_AS_pack 2@

Вот видео:


Минусы подхода:
1) Долго нужно вычислять время анимаций
2) Анимационные блоки не всегда выполняются долго, приходится разбивать их на несколько штук, как в моём примере.
3) Есть вероятность натолкнутся на другого актёра, машину, объект, что приводит к прекращению анимационного пакета или смещения траектории движения

Этот метод отлично подходит для видеороликов. По другому реализовать это очень очень очень сложно, хотя я не исключаю, что народные умельцы могут сделать такое.

Михан500
Пользователи
19.03.14 19:52
Offline
Люди, но вот в чем дело:я делаю зомби мод, и чтобы отличаться я сделал чтобы они лазали по препятствиям.Код устроен таким образом, что один скрипт управляет одним зомби.Я просто скопировал этот скрипт 30 раз.В папке клео 30 одинаковых копий
, все они работают одновременно, но вылет через 20 минут работы скриптов.Когда их 10, то все хорошо.Я выйснил из-за какой части вылет, эта часть где проверяется близость актера к игроку, если ее удалить, то вылета не происходит независимо от количества скриптов.Я не понимаю, может все засунуть в один скрипт, и пускай один скрипт руководит тремя зомби.Сложное это дело на движке са зомби мод хороший делать.Проект из-за этого вылета остановлен...

BoPoH
Друзья
23.03.14 20:59
Offline
Делать зомби мод с управлением каждым зомби отдельным скриптом это же.... такой непрофессионализм, мягко говоря...

Slivkin-Sergey
Модераторы
23.03.14 21:12
Offline
Есть вопросик для тех, кто разбирается в псевдокоде IDA (потому что это
Код
*(float *)((char *)&v40 + v24) = (flt_BA8308 * *(float *)((char *)&v50 + v24)

мне не говорит ни о чём, кроме того, что присваивается какое-то значение какому-то указателю), ну или в ассемблере. В общем, есть процедура 0x5853D0, которая принимает в качестве аргументов 2 числа и чар:
Код
void __cdecl sub_5853D0(int a1, int a2, char a3)

Известно, что она может всячески манипулировать территориями банд и их цветами в частности. Внимание, вопрос: как ей воспользоваться, чтобы инвертировать цвета территорий гроув и болла (т.е. у гроув пурпурный и соответственно)?

Если этот набор символов (по крайней мере, для меня он таковым является) может чем-то помочь, я очень рад:
Код
void __cdecl sub_5853D0(int a1, int a2, char a3)
{
     int v3; // eax@6
     int v4; // edi@6
     int v5; // eax@6
     int v6; // edx@6
     long double v7; // fst6@6
     long double v8; // fst7@6
     float v9; // edx@6
     float v10; // ST24_4@6
     float v11; // eax@6
     float v12; // ST28_4@6
     long double v13; // fst7@6
     long double v14; // fst6@6
     long double v15; // fst5@6
     float v16; // ST24_4@6
     long double v17; // fst6@6
     float v18; // ST24_4@6
     long double v19; // fst6@6
     float v20; // ST28_4@6
     float v21; // ST2C_4@6
     long double v22; // fst7@6
     long double v23; // fst6@6
     int v24; // edx@8
     char v25; // bl@8
     int v26; // ebp@8
     int v27; // edx@9
     char *v28; // esi@9
     long double v29; // fst7@10
     long double v30; // fst7@10
     float v31; // [sp+Ch] [bp-120h]@6
     float v32; // [sp+10h] [bp-11Ch]@6
     float v33; // [sp+14h] [bp-118h]@6
     float v34; // [sp+18h] [bp-114h]@6
     float v35; // [sp+1Ch] [bp-110h]@6
     float v36; // [sp+20h] [bp-10Ch]@6
     float v37; // [sp+24h] [bp-108h]@6
     float v38; // [sp+28h] [bp-104h]@6
     float v39; // [sp+2Ch] [bp-100h]@9
     float v40; // [sp+30h] [bp-FCh]@9
     float v41; // [sp+34h] [bp-F8h]@6
     float v42; // [sp+38h] [bp-F4h]@6
     float v43; // [sp+3Ch] [bp-F0h]@6
     float v44; // [sp+40h] [bp-ECh]@6
     float v45; // [sp+44h] [bp-E8h]@6
     float v46; // [sp+48h] [bp-E4h]@6
     float v47; // [sp+6Ch] [bp-C0h]@10
     float v48; // [sp+70h] [bp-BCh]@10
     int v49; // [sp+ACh] [bp-80h]@6
     float v50; // [sp+B0h] [bp-7Ch]@9
     int v51; // [sp+ECh] [bp-40h]@9
     float v52; // [sp+F0h] [bp-3Ch]@10

     if ( a3
       || *(float *)a1 <= (long double)flt_8D0928
       && *(float *)(a1 + 8) >= (long double)flt_8D0920
       && *(float *)(a1 + 12) <= (long double)flt_8D0924
       && *(float *)(a1 + 4) >= (long double)flt_8D092C )
     {
       v5 = *(_DWORD *)(a1 + 8);
       v6 = *(_DWORD *)(a1 + 12);
       v7 = *(float *)a1;
       v8 = *(float *)(a1 + 12);
       LODWORD(v41) = v5;
       LODWORD(v42) = v6;
       LODWORD(v9) = *(_DWORD *)(a1 + 4);
       LODWORD(v43) = v5;
       v10 = v7 - flt_BAA248;
       v44 = v9;
       LODWORD(v11) = *(_DWORD *)a1;
       v45 = v11;
       v12 = v8 - flt_BAA24C;
       v46 = v9;
       v13 = 1.0 / flt_BA8314;
       v14 = v10 * v13;
       v15 = v13 * v12;
       v31 = flt_BA830C * v15 + v14 * flt_BA8308;
       v32 = v15 * flt_BA8308 - v14 * flt_BA830C;
       v16 = v13 * (v41 - flt_BAA248);
       v17 = v13 * (v42 - flt_BAA24C);
       v33 = flt_BA830C * v17 + v16 * flt_BA8308;
       v34 = v17 * flt_BA8308 - v16 * flt_BA830C;
       v18 = v13 * (v43 - flt_BAA248);
       v19 = v13 * (v9 - flt_BAA24C);
       v35 = flt_BA830C * v19 + v18 * flt_BA8308;
       v36 = v19 * flt_BA8308 - v18 * flt_BA830C;
       v20 = v9 - flt_BAA24C;
       v21 = v13;
       v22 = (v11 - flt_BAA248) * v13;
       v23 = v21 * v20;
       v37 = flt_BA830C * v23 + v22 * flt_BA8308;
       v38 = v23 * flt_BA8308 - v22 * flt_BA830C;
       v3 = sub_585040(&v49, &v31);
       v4 = v3;
       if ( v3 )
       {
         if ( v3 > 0 )
         {
           v25 = menu.drawRadarOrMap;
           v24 = 0;
           v26 = v3;
           do
           {
             v28 = (char *)&v51 + v24;
             *(float *)((char *)&v39 + v24) = (flt_BA8308 * *(float *)((char *)&v49 + v24)
                      - flt_BA830C * *(float *)((char *)&v50 + v24))
                      * flt_BA8314
                      + flt_BAA248;
             *(float *)((char *)&v40 + v24) = (flt_BA8308 * *(float *)((char *)&v50 + v24)
                      + flt_BA830C * *(float *)((char *)&v49 + v24))
                      * flt_BA8314
                      + flt_BAA24C;
             _getRadarZoom((char *)&v51 + v24, (char *)&v49 + v24);
             if ( v25 )
             {
               v29 = (long double)(signed int)*(&RsGlobal + 1) * 0.001562500023283064;
               *(float *)v28 = v29 * *(float *)v28;
               *(float *)((char *)&v47 + v27) = v29 * *(float *)((char *)&v47 + v27);
               v30 = (long double)(signed int)*(&RsGlobal + 2) * 0.002232142956927419;
               *(float *)((char *)&v52 + v27) = v30 * *(float *)((char *)&v52 + v27);
               *(float *)((char *)&v48 + v27) = v30 * *(float *)((char *)&v48 + v27);
             }
             v24 = v27 + 8;
             --v26;
           }
           while ( v26 );
         }
         (*(void (__cdecl **)(signed int, signed int))(RwEngineInstance + 32))(12, 1);
         (*(void (__cdecl **)(signed int, _DWORD))(RwEngineInstance + 32))(1, 0);
         sub_727890(v4, &v51, &v47, a2);
         if ( v4 > 2 )
           im2DRenderPrimitive(rwPRIMTYPETRIFAN, &vertices, v4);
       }
     }
}


Кроме того, в комментариях к ассемблерному коду процедуры есть такая строка: CODE XREF: _?paintMapZones+20Bp , что, несомненно, свидетельствует о том, что перекрасить территорию той или иной банды - вполне в компетенции данной функции.
Отредактировал Slivkin-Sergey - Понедельник, 24.03.14, 06:19

BoPoH
Друзья
24.03.14 21:21
Offline
sub_5853D0 - это функция рендеринга прямоугольника на радаре.
Первый параметр - указатель на структуру CRect, которая, судя по всему, содержит координаты углов прямоугольника, который отрисовывается функцией.
Второй параметр - указатель на структуру RwRGBA, которая содержит цвет прямоугольника.
Третий параметр - это флаг, говорящий функции, нужно ли производить рендер прямоугольника, даже если он находится за пределами радара.

Цитата Slivkin-Sergey ()
Кроме того, в комментариях к ассемблерному коду процедуры есть такая строка: CODE XREF: _?paintMapZones+20Bp , что, несомненно, свидетельствует о том, что перекрасить территорию той или иной банды - вполне в компетенции данной функции.
Эта строка свидетельствует о том, что эта функция вызывается из функции paintMapZones. Вообще, тебе скорее всего нужна будет не эта функция, а другая, которая создаёт зоны банд. Её, вероятно, можно хукнуть и подменять цвет на нужный.
Отредактировал BoPoH - Понедельник, 24.03.14, 21:22

Slivkin-Sergey
Модераторы
25.03.14 18:07
Offline
Цитата BoPoH ()
sub_5853D0 - это функция рендеринга прямоугольника на радаре.

Хм-м, в одной из западных Бд она числится как DrawAreaOnRadar. Т.е. ты утверждаешь, что при помощи этой функции можно нарисовать на карте квадрат любого размера, цвета и прозрачности?
Цитата BoPoH ()
Вообще, тебе скорее всего нужна будет не эта функция, а другая, которая создаёт зоны банд

Какая же?

И ещё один вопрос: можно ли сделать .dll функцию, принимающую в качестве параметра указатель на string (или char) и очищающая от него память, включить её в скрипт и передать, например, 12@v? Очистится ли тогда место 12@ в памяти?

BoPoH
Друзья
26.03.14 19:04
Offline
Цитата Slivkin-Sergey ()
Какая же?
Не знаю. Искать нужно.

Цитата Slivkin-Sergey ()
И ещё один вопрос: можно ли сделать .dll функцию, принимающую в качестве параметра указатель на string (или char) и очищающая от него память, включить её в скрипт и передать, например, 12@v? Очистится ли тогда место 12@ в памяти?
Не совсем понял, что именно тебе нужно? Зачем очищать место 12@ в памяти? Что ты подразумеваешь под "местом"? Выразись более понятно, лучше приведи пример.

Slivkin-Sergey
Модераторы
27.03.14 08:58
Offline
Цитата BoPoH ()
Зачем очищать место 12@ в памяти? Что ты подразумеваешь под "местом"?

Я подразумеваю ячейку в памяти (4 байта для int...) переменной 12@v.

BoPoH
Друзья
27.03.14 17:47
Offline
Цитата Slivkin-Sergey ()
Я подразумеваю ячейку в памяти (4 байта для int...) переменной 12@v
12@v означает стринговую переменную. В любом случае, что мешает просто написать 12@ = 0?

Cool_T
Пользователи
30.03.14 12:00
Offline
Друзья у меня не работают скрипты не знаю в чём проблема... Когда я завершаю написание скрипта всегда выходит ошибка "переход на нулевой оффсет" и когда я исправляю её то скрипт спокойно компилируется но он не работает... В чём дело?

Yurko_UA
Друзья
30.03.14 12:16
Offline
Цитата Cool_T ()
Друзья у меня не работают скрипты не знаю в чём проблема... Когда я завершаю написание скрипта всегда выходит ошибка "переход на нулевой оффсет" и когда я исправляю её то скрипт спокойно компилируется но он не работает... В чём дело?
В самом начале скрипта пропиши опкод 0000:

Cool_T
Пользователи
30.03.14 12:54
Offline
Я прописывал такое в самом начале скрипта,скрипт компилировался,но когда я его проверяю он не работает

HYPERMUV
Проверенные
30.03.14 12:57
Offline
Цитата Cool_T ()
Я прописывал такое в самом начале скрипта,скрипт компилировался,но когда я его проверяю он не работает
Код в студию

Михан500
Пользователи
30.03.14 13:26
Offline
Насчет моего мода:Я решил проблему.

Форум » Игры серии GTA » GTA San Andreas » Вопросы по скриптингу Sanny Builder (Вы можете получить ответы на вопросы по SB)
Поиск: