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

или

Также указывайте полный код скрипта, иначе причина ошибок может быть и не выявлена.

Внимание! От этого момента тема предназначена ещё и для заказов скриптов и миссий. Я это сделал по одной причине - пользователи постоянно путают/или не ищут темы и приводят заказ здесь. Теперь этой путаницы не будет. Здесь можно проводить заказы, но Вы должны указать в начале поста текст "НА ЗАКАЗ". Постарайтесь как можно детальнее объяснить суть скрипта.
Прикрепления: 0248203.png(1Kb) · 9085525.png(0Kb)

Slivkin-Sergey
Модераторы
11.06.14 21:25
Offline
Теперь точно ничего не понимаю, не могу загрузить банальнейшую текстуру, зависон неизбежен:
Код
:TEXTURE
thread 'TEXTURE'
wait 0      
if
0AB0:  key_pressed 49
jf @TEXTURE
0390: load_txd_dictionary 'LD_DUAL'
038F: load_texture "light" as 1
wait 250

:TEXTURE_1
wait 0
if
0AB0:  key_pressed 49
then
0391: release_txd_dictionary
wait 250
jump @TEXTURE
end           
jump @TEXTURE_1

BoPoH
Друзья
12.06.14 13:11
Offline
Цитата Slivkin-Sergey ()
Теперь точно ничего не понимаю, не могу загрузить банальнейшую текстуру, зависон неизбежен:
Я даже не знаю, что тут может быть не так, т.к. у меня ничего не зависает.
Отредактировал BoPoH - Четверг, 12.06.14, 13:12

Михан500
Пользователи
12.06.14 15:51
Offline
BoPoH, какая важная информация говоришь?Я не хочу чтобы кто то открыл мой main.scm, взял какую то любую часть кода и вставил под своим именем.Хочу защититься от плагиата, я немало в этом main.scm кода написал...Я знаю что любую защиту можно обойти, но ведь не каждый человек сможет.Попробую hex editor' ом удалить один байт 0000: . Спасибо на этом.

Добавлено (12.06.14, 14:46)
---------------------------------------------
Все, немного практики в hex editor, и при декомплияции выдает Range check error, а в игре все работает.

Добавлено (12.06.14, 14:51)
---------------------------------------------
А если убрать защиту hex editor' ом, то sanny builder выдает неверный заголовок файла.

Отредактировал Михан500 - Четверг, 12.06.14, 15:28

Slivkin-Sergey
Модераторы
12.06.14 18:38
Offline
Цитата Михан500 ()
А если убрать защиту hex editor' ом, то sanny builder выдает неверный заголовок файла.

Можешь скинуть сюда, если окончательно уверен в надёжности этой защиты, такое открывается на раз-два, причём стандартными средствами СБ.
Добавлено (12.06.14, 17:25)
---------------------------------------------
Да и вообще, чего там может быть такого, чтоб так яростно это защищать? Не было ещё ни одного случая кражи глобальных модов. Я тоже уже почти год пишу проект на main.scm, там фишки и похлеще есть, например, тряпично-кукольная физика падений, но я же не паранойю и не пекусь о своём чувстве собственного достоинства, что якобы кто-то это сделал, а я нет. В случае кражи я просто покажу неверящим кусок исходного кода - самая надёжная защита.

Добавлено (12.06.14, 17:38)
---------------------------------------------
Цитата BoPoH ()
// Читаем в 10@ указатель на пул педов
// Читаем в 11@ указатель на массив педов

ВОТ те самые два слова! Чем же они так отличаются?
Цитата BoPoH ()
в структуре пула

Пул - это ведь что-то наподобие массива с элементами, а структура - сборище данных в одной переменной?.. Хотя я определённо чего-то недопонимаю, но чего?..
Цитата BoPoH ()
// Прибавляем смещение, по котому записан RwObject педа

Что это за зверь такой - RwObject? Не от него ли наследуется CPed, или всё-таки от CPlaceable?
Ну а в целом, эта субъективно-мутная каша с перебором педов в массиве начинает проясняться для меня...
Отредактировал Slivkin-Sergey - Четверг, 12.06.14, 18:39

BoPoH
Друзья
12.06.14 21:23
Offline
Ну, тебе нужно для начала понять, что собой представляет структура. Потому что пул (Pool) - это структура. Структура - это набор переменных, в некотором роде. Указатель - это адрес чего-либо (структуры, массива, переменной) в памяти. Указатель представляет собой обычное число (4 байта).
Следует понимать, что любые данные находятся где-то в памяти. Если мы говорим о работе с ними через CLEO, то можно подразумевать, что мы всегда будем работать с указателями. Т.е. мы будем иметь не структуру, а указатель на структуру. Это как если бы мы, вместо того, чтобы хранить число в переменной 1@, записали бы в 1@ указатель на участок памяти и потом читали бы эту память или записывали в неё, имея её адрес (указатель) в переменной 1@. В таком случае, можно (грубо говоря) назвать переменную 1@ указателем.
Вернёмся к структурам. К примеру, возьмём структуру пула педов.
Код
struct CPedPool
{
      CPed *objects;
      char *flags;
      int size;
      int top;
      char initialized;
      char field_11;
};


Так она будет выглядеть на языке C++ (в оригинале она выглядит немного по-другому, имена элементов должны быть другими, эта структура - лишь результат реверс-инжиниринга). Нас интересует здесь самый первый указатель - это указатель на массив педов. Этот массив представляет собой просто "кусок" памяти, размер которого составляет размер структуры педа помноженный на макс. кол-во педов в массиве. Все структуры педов идут друг за другом, если можно так выразиться. Так вот, оффсет первого параметра в структуре составляет 0, т.к. он первый, следовательно, к указателю на структуру пула нам ничего не нужно прибавлять (вообразим, что мы прибавили ноль), просто читаем значение по этому адресу. Таким образом мы получаем указатель на массив педов.
А чтобы, к примеру, получить размер массива, нам нужно прочитать параметр size в структуре пула. Учитывая, что первые два параметра являются указателями (т.е. каждый занимает в структуре по 4 байта), то нужно прибавить 8 к указателю на структуру пула и прочесть значение.
Забыл кое-что упомянуть - о том, как мы получили указатель на структуру пула. Он хранится в памяти игры, по "постоянному" адресу (0xB74490). Прочтя его, мы получаем указатель на пул. А уже в структуре пула хранится указатель на массив педов. Поэтому нам пришлось сначала получить указатель на пул, чтобы добраться до педов.

Что касается RwObject. Это такая структура, которая включает в себя много разных других структур (о которых нет смысла сейчас говорить), проще говоря, все они представляют модель (вертексы, полигоны, текстуры). Кстати, префикс Rw в начале названия структуры - отсылка к движку RenderWare, на котором основана игра. По сути, RwObject - это структура из движка RenderWare.
Что касается наследия. Если говорить о полной цепочке, то CPed наследуется от CPhysical, а тот - от CEntity, который в свою очередь наследуется от CPlaceable. RwObject не является наследником или наследуемым, это просто параметр в структуре CEntity (по смещению 0x18). А учитывая то, что CPed берёт наследие от CEntity в определённом смысле, то в его структуре так же будет находиться указатель на RwObject по смещению 0x18.
Проще всего наследие представить в виде матрёшек, когда маленькие спрятаны внутри больших. Тогда, то, что находится в маленькой матрёшке, по сути, находится и в большой.

Добавлено (12.06.14, 20:23)
---------------------------------------------

Цитата Slivkin-Sergey ()
Да и вообще, чего там может быть такого, чтоб так яростно это защищать? Не было ещё ни одного случая кражи глобальных модов.
Я к тому же веду. Может быть, любой дурак может открыть main.scm и скопировать код. Но далеко не каждый сможет его правильно применить. Я почти уверен, что никаких особо сложных и ценных алгоритмов у тебя там нет.
Я вот недавно выложил исходники одного из своих модов. И знаешь, они никому, по ходу, не пригодились, поскольку никто не понял что к чему там happy . По крайней мере, я не видел ни одного мода на основе моих исходников.
Конечно, я тоже беспокоился раньше о том, что "мой код могут стырить", но... просто это никому нафиг не нужно. На свете есть гораздо более стоящие вещи.
Отредактировал BoPoH - Четверг, 12.06.14, 21:14

Slivkin-Sergey
Модераторы
13.06.14 16:56
Offline
Погоди-ка... Я правильно понял, что CPedPool - это, грубо говоря, склад данных о массиве CPed?
Цитата BoPoH ()
Указатель - это адрес чего-либо (структуры, массива, переменной) в памяти. Указатель представляет собой обычное число (4 байта).

О принципе размещения данных в памяти я знаю, всё-таки в С++ я тоже практикуюсь.
Цитата BoPoH ()
Rw в начале названия структуры - отсылка к движку RenderWare, на котором основана игра

Эм-м...
Цитата BoPoH ()
Прочтя его, мы получаем указатель на пул.

То есть пролог об указателях был для этого; тип [pointer] в памяти можно просто считать и манипулировать как с обычным хэндлом?

И небольшой вопрос по С++, ибо он настолько мал, что не хочется набивать тему; если я напишу (грубо говоря,, синтаксис указателей я точно сейчас не помню):
Код
int a;
int b = &a;
&a = 0x11111

То будет ли это значить, что я помещу переменную в ячейку по адресу 0x11111?

BoPoH
Друзья
13.06.14 22:24
Offline
Цитата Slivkin-Sergey ()
int a; int b = &a;
&a = 0x11111
Так делать нельзя. В C++ есть различия между указателем на переменную определённого типа данных и самой переменной. Т.е. если ты объявил интовую переменную a, то &a нельзя записать в переменную того же типа int. Или нельзя присвоить интовой переменной адрес другой интовой переменной (как у тебя написано).
В C++ существуют переменные-указатели. По сути, это обычная 4-байтовая переменная, но, скажем, указатель на интовую переменную не тоже самое, что указатель на флоатовую переменную.
Вероятно, ты хотел написать что-то вроде этого:

Код
int a;
int *b = &a; // Переменная b в данном случае будет являться указателем на переменную a
*b = 0x11111;

Цитата Slivkin-Sergey ()
То есть пролог об указателях был для этого; тип [pointer]в памяти можно просто считать и манипулировать как с обычным хэндлом?
Пролог был для этого, да. Хендл и указатель - это разные вещи. Да, и мне не очень понятно, как можно манипулировать с обычным хендлом? Что ты подразумеваешь?
Представь, что игра - это не экзешник, а код на C++ (потому что изначально так и было). И вот где-то там было примерно такое объявление:

Код
CPedPool *PedPool;
Т.е. PedPool - это переменная-указатель на пул педов. После инициализации пула (при старте игры) ей присвоили адрес самого пула (для пула выделили память, а её адрес записали в переменную-указатель).
Так вот, в екзешнике эта самая переменная-указатель находится по определённому адресу (который мы знаем). Этот адрес мы и читаем как-бы из той самой переменной-указателя.

Цитата Slivkin-Sergey ()
Я правильно понял, что CPedPool - это, грубо говоря, склад данных о массиве CPed?
Довольно грубо, но в общем смысле верно. Лучше почитать про структуры и классы в C++;

Slivkin-Sergey
Модераторы
14.06.14 08:03
Offline
Цитата BoPoH ()
Вероятно, ты хотел написать что-то вроде этого:

Да-да, забыл звёздочку поставить.
Цитата BoPoH ()
Лучше почитать про структуры и классы в C++;

Я прочитал, но так и не понял толком, чем они отличаются :dummy:
Цитата BoPoH ()
Хендл и указатель - это разные вещи

Я знаю. Но ты ведь говорил, что переменную в СБ можно представить как указатель, то есть, манипулируя с хэндлом в СБ, манипулируем с указателем на объект на машинном уровне.
Манипулировать - это значит использовать его. Например, Actor.SetImmunities().

BoPoH
Друзья
14.06.14 16:36
Offline
Цитата Slivkin-Sergey ()
Но ты ведь говорил, что переменную в СБ можно представить как указатель
В принципе да. Просто хендл - это, обычно, некий идентификационный номер. А указатель - это адрес в памяти.

Цитата Slivkin-Sergey ()
Я прочитал, но так и не понял толком, чем они отличаются
В принципе, ничем особенным. Просто классы можно наследовать от других классов, у классов есть свои функции, применимые только к объектам данного класса или ко всем классам, наследуемым от этого класса (у структур нет такого). У классов много особенностей, короче. Хотя, данные хранятся точно так же, как в структурах.
Можно сказать, что класс - это та же самая структура, но на неё ещё повесили возможность наследования и добавили функции, применимые к этому классу.

Slivkin-Sergey
Модераторы
14.06.14 20:40
Offline
Постоянно забываю про функции в классах... Так что насчёт
Цитата BoPoH ()
int a;
int *b = &a; // Переменная b в данном случае будет являться указателем на переменную a
*b = 0x11111;

Будет ли это значить, что
Цитата Slivkin-Sergey ()
я помещу переменную в ячейку по адресу 0x11111

?

И банальный вопрос, ответ на который у меня почему-то всегда вылетает из памяти - при получении структуры актёра в переменную; нужно читать адрес и потом что-то делать, или сразу прибавлять смещение?

BoPoH
Друзья
15.06.14 02:00
Offline
Цитата Slivkin-Sergey ()
нужно читать адрес и потом что-то делать, или сразу прибавлять смещение?
К адресу нужно прибавлять смещение а потом читать/записывать.

Цитата Slivkin-Sergey ()
я помещу переменную в ячейку по адресу 0x11111
Нельзя поместить переменную куда-то в память. Да и смысла в этом нет. Можно изменить адрес указателя. Т.е. у тебя есть переменная-указатель "b". Исходя из того кода можно увидеть, что сперва мы присваиваем ей адрес переменной "a", а потом записываем по этому адресу (т.е. фактически, в переменную "a") значение 0x11111.

Slivkin-Sergey
Модераторы
15.06.14 08:18
Offline
Да ёпт, как так, опяь чего-то не то написал. Я говорил, что не помню точно синтаксис. Я имел ввиду:
Код
&b = 0x11111;

Sweeper
Проверенные
15.06.14 12:40
Offline
У меня возник вопрос из-за любопытства: реально ли в GTA SA добавлять свои машины, оружия, одежду не заменяя имеющихся?

BoPoH
Друзья
15.06.14 13:13
Offline
Цитата Slivkin-Sergey ()
&b = 0x11111;

Вспомнил, что есть такая вещь, как ссылка.
Код
int &b = a;

Ну или
Код
int &b = *(int *)0x11111;

Добавлено (15.06.14, 12:13)
---------------------------------------------

Цитата Sweeper ()
У меня возник вопрос из-за любопытства: реально ли в GTA SA добавлять свои машины, оружия, одежду не заменяя имеющихся?

Теоретически - да.
Отредактировал BoPoH - Воскресенье, 15.06.14, 13:12

Slivkin-Sergey
Модераторы
15.06.14 17:18
Offline
Цитата BoPoH ()
*(int *)0x11111;

Во! Я такую запись в иде уже раз сто встречал, только там было похлеще, типа *(void *)(DWORD * *(DWORD PTR aReset_to_)).
И что тогда обозначает запись
Цитата BoPoH ()
int &b = *(int *)0x11111;
?
Отредактировал Slivkin-Sergey - Воскресенье, 15.06.14, 17:19

BoPoH
Друзья
15.06.14 17:33
Offline
Цитата Slivkin-Sergey ()
И что тогда обозначает запись

Это значит, что, когда ты будешь писать
Код
b = 150;

то по адресу 0x11111 будет записано 150. По сути, это то, что тебе и было нужно (я так понял, по крайней мере) - переменная b будет как-бы находиться в памяти по адресу 0x11111. Ну, это как указатель, но "без указателя". Вот эти два действия идентичны:
Код
b = 150;
*(int *)0x11111 = 150;
Отредактировал BoPoH - Воскресенье, 15.06.14, 17:33

)))DiMoN(((
Пользователи
16.06.14 17:43
Offline
Здравствуйте! Мне очень понравились ваши уроки, по ним и учусь! Скажите, а можно сделать, чтобы при выстреле в педа, пед как бы стал замороженным, то есть терял контроль?
Если да, то какой опкод за это отвечает?
Заранее спасибо!

Михан500
Пользователи
16.06.14 18:34
Offline
Цитата )))DiMoN((( ()
Здравствуйте! Мне очень понравились ваши уроки, по ним и учусь! Скажите, а можно сделать, чтобы при выстреле в педа, пед как бы стал замороженным, то есть терял контроль? Если да, то какой опкод за это отвечает?
Заранее спасибо!
Как именно замороженным, не мог двигаться?

Slivkin-Sergey
Модераторы
16.06.14 18:45
Offline
Цитата )))DiMoN((( ()
Скажите, а можно сделать, чтобы при выстреле в педа, пед как бы стал замороженным, то есть терял контроль?

Можно.
Цитата )))DiMoN((( ()
Если да, то какой опкод за это отвечает?

Actor.LockInCurrentPosition.

)))DiMoN(((
Пользователи
16.06.14 19:24
Offline
Цитата Михан500 ()
Как именно замороженным, не мог двигаться?
да

Добавлено (16.06.14, 18:24)
---------------------------------------------

Цитата Slivkin-Sergey ()
Actor.LockInCurrentPosition.
а как сделать чтобы этот опкод сработал на педа после выстрела?

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