// AGFC: FAQ по скриптингу     

искать во всех форумах
Guest  
 Absolute Games Forums Central
Форумы подсайтов AG
Grand Theft AG
FAQ по скриптингу
(Просмотров: 277216)

 
«« | »»

(Модераторы: ThunderN[ВС], Mikharein, Jabz[BC])

 Страницы: « 1 ... 93 94 95 96 97 98 99 100 101 ... 103 »       RSS темы | ?
Ответить Начать новую тему
   Автор Подписаться на темуПодписаться на тему 
Seemann
Добрый Император


Профиль

Затемнить
Оценил игр: 24
Репутация: 992 [-][+]

 Re: FAQ по Mission Builder (Ответ #2400) ссылка
    3 декабря 2006, 20:07




2Katyа:
Это можно использовать в мемхаке? Какие плюсы есть? Честно говоря, не вижу разницы, откуда менять локальные вары.

локальные переменные любого активного потока можно менять из любого места скрипта (т.е. любого другого потока)
Речь идет об изменении локальных переменных в самом main'е. Технология та же, что и при редактировании адресов памяти. Таким образом можно изменять локальные переменные любого потока. Не знаю пока, как это можно использовать, но сама идея мне кажется привлекательной.






http://sannybuilder.com/
ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2401) ссылка
    3 декабря 2006, 20:38




Я просто не могу понять, где это можно будет использовать А так идея хорошая.
Если возьмешься - обеими ручищами  

Добавление от 3 декабря 2006, 20:39
Ух ты какой смайлик  

Редактировалось: 3 декабря 2006, 20:39 (Knuckles)

ПроцитироватьПроцитировать
Capushon
Добрый Император


Профиль
Сайт
Затемнить
Оценил игр: 0
Репутация: 655 [-][+]

 Re: FAQ по Mission Builder (Ответ #2402) ссылка
    3 декабря 2006, 22:56




2Seemann:
локальные переменные любого активного потока можно менять из любого места скрипта (т.е. любого другого потока)
Очень интересно! Примерчик бы ... Или это только в MH?





Скриптовый мультимод для SA: http://www.capushon.sannybuilder.com/
Сначала ты надежда и гордость, потом о спину ломают аршин  (c)БГ
ПроцитироватьПроцитировать
DragRom
Добрый Маг Форумов


Профиль
Сайт
Затемнить
Оценил игр: 4
Репутация: 151 [-][+]

 Re: FAQ по Mission Builder (Ответ #2403) ссылка
    3 декабря 2006, 23:55




2Seemann: Кстати, сейчас работал с MH и вдруг понял, что локальные переменные любого активного потока можно менять из любого места скрипта (т.е. любого другого потока). (естественно в SA). Кому-нибудь это интересно? Стоит проводить дополнительные исследования?
Конечно исследуй! Но правда малопонятно это... Если найти сильные стороны в этом, то можно облегчить процесс.
Речь идет об изменении локальных переменных в самом main'е
Стоп. А зачем их изменять? Они по-другому изменяются сейчас?


ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2404) ссылка
    4 декабря 2006, 00:11




2DragRom: Стоп. А зачем их изменять? Они по-другому изменяются сейчас?
Не въезжаю
Симэн, а Ксиен уже это дело бросил? Или уже еще?


ПроцитироватьПроцитировать
Seemann
Добрый Император


Профиль

Затемнить
Оценил игр: 24
Репутация: 992 [-][+]

 Re: FAQ по Mission Builder (Ответ #2405) ссылка
    4 декабря 2006, 17:34




2Katyа:
а Ксиен уже это дело бросил?
Не знаю, я уже долгое время не получал от него сообщений.

2Capushon:
Или это только в MH?
MH здесь не при чем. Я упомянул MH, только потому, что понял, что ту же технологию изменения локальных переменных как в нем, можно внедрить и в SCM.

2DragRom: А зачем их изменять? Они по-другому изменяются сейчас?

Ну в теории скриптинга всегда был постулат: локальные переменные одного потока доступны только в пределах этого потока. Т.е. есть например поток A со своими 34 переменными и поток B со своими 34. По общему правилу поток B ничего не может сделать с переменными потока A.
Мне захотелось опровергнуть этот постулат. Можете считать это игрой мускулов, но как знать, может где-нибудь это пригодится?

Сам рабочий пример уже готов. Сразу скажу, что работать будет только в Sanny Builder версии не ниже 2.99

Объясняю принцип работы:
Все потоки хранятся в памяти в виде структур (записей) размером по 221 байт. В эти байты входят и разные флаги, и стек ретурнов (return), и массив локальных переменных (34*4) в 136 байтов. Для получения доступа к ним, мы должны сначала отыскать нужный поток по его имени (вот почему я всегда советую "называть" потоки через 03a4). После того как мы нашли его, мы можем сделать с ним, что захотим. Например, изменить любую переменную, т.е. выполнить нашу первоначальную цель.

Теперь объясню, почему будет работать только в SB 2.99+ Дело в том, что игра хранит имена потоков в нижнем регистре (независимо от того, как они были записаны в SCM). Опкод 05AD по непонятной мне причине работает с учетом регистра, т.е. грубо говоря,

05AD: 'string1' == 'String1'

проверка вернет False.

Проблема в том, что все компиляторы по умолчанию переводят строки в верхний регистр. Поэтому проверка имени, которая идет в указанном примере срабатывать не будет. В Sanny Builder 2.99+ однако есть опция конвертирования регистра букв (меню Форматирование). Для корретной работы примера эта опция должна быть переведена в положение 'Как есть' (As is). Можно еще 'нижний' (lower), но тогда не будут работать тексты, которые наоборот используются в вернем регистре.

Собственно пример. Два потока с именами TEST и CLV. В потоке TEST есть переменная 10@, которая содержит значение 10000. Значение этой переменной выводится на экран через секунду после запуска потока (это чтобы значение гарантированно успело измениться).
Второй поток интереснее. Он ищет в памяти поток TEST, если находит, то меняет значение его десятой локалки на 3333. Именно это значение и появится на экране.

create_thread @TEST1
create_thread @CLV_THREAD
end_thread


// ---------------------------------------------
//  This thread shows a number after 1 sec
//  after activated. The number is stored in 10@
// ---------------------------------------------
:TEST1
thread 'TEST'
 10@ = 10000
 wait 1000
 054C: use_GXT_table 'POOL'
 01E3: text_1number_styled 'NUM' 10@ 5000 ms 1  // ~1~
end_thread

// ---------------------------------------------
//  This thread searches the one named TEST
//  and changes its local variable 10@
// ---------------------------------------------
:CLV_THREAD
thread 'CLV'
 {
   0@  =  thread address
   1@  =  temp
 }
 0@ = 0xA8B42C  
 // FIND_THREAD_LOOP
 while true
   // MEMORY READ DWORD
   0@ -= 0xA49960
   0@ /= 4
   008B: 0@ = &0(0@,1i)
   // 1@ = first active thread
   if 0@ == 0
   then
     Break // no threads, search failed
   end
   0085: 1@ = 0@    // save the pointer
   // get thread name magic address
   div(1@, 8)
   dec(1@, 1 348 395)
   {
    IMPORTANT NOTE:
     thread names are stored in lowercase registry,
     so we've to compare it in lowercase as well.
     SB option 'Case Converting' has to be set to 'As is'!
   }
   if &0(1@,1s) == 'test'
   // check if this thread's name is ""
   then    
     // well, we've found it, can do everything with it
     // 0@ contains that thread address

     // get address of 10@      
     inc(0@, 0x3c)     // thread locals pool
     inc(0@, 40)       // dword* 10 = 40
   
     // MEMORY WRITE DWORD
     0@ -= 0xA49960
     0@ /= 4
     &0(0@,1i) = 3333  // thread(test).10@ = 3333  

     Break // end the LOOP
   else
     // no, that thread has another name
     // check the next one
     wait 0
   end
   // go to while_begin
 end
 // variable changed, end_thread  
end_thread


Много комментариев, плюс высокоуровневый код => немаленький размер. Можно слегка оптимизировать, но тогда ухудшится восприятие.


Добавление от 4 декабря 2006, 17:08
ну и простая версия, для сравнения

004F: create_thread @TEST
004F: create_thread @CLV
004E: end_thread

// ---------------------------------------------

:TEST
03A4: name_thread 'TEST'
0006: 10@ = 10000 // integer values
0001: wait 1000 ms
054C: use_GXT_table 'POOL'
01E3: text_1number_styled 'NUM' 10@ 5000 ms 1  // ~1~
004E: end_thread

// ---------------------------------------------

:CLV
03A4: name_thread 'CLV'
0006: 0@ = 11056172 // integer values

:CLV_21
000E: 0@ -= 10787168 // integer values
0016: 0@ /= 4 // integer values
008B: 0@ = &0(0@,1i) // integer values and handles
00D6: if
8039:   not  0@ == 0 // integer values
004D: jump_if_false @CLV_183
0085: 1@ = 0@ // integer values and handles
0016: 1@ /= 8 // integer values
000E: 1@ -= 1348395 // integer values
00D6: if
05AD:   &0(1@,1s) == 'test' // 8-byte strings
004D: jump_if_false @CLV_172
000A: 0@ += 100 // integer values
000E: 0@ -= 10787168 // integer values
0016: 0@ /= 4 // integer values
0004: &0(0@,1i) = 3333 // integer values
0002: jump @CLV_183

:CLV_172
0001: wait 0 ms
0002: jump @CLV_21

:CLV_183
004E: end_thread

// ---------------------------------------------




Добавление от 4 декабря 2006, 17:54
оптимизированный CLV

Cпойлер (щелкните, чтобы прочесть):



Редактировалось: 4 декабря 2006, 17:54 (Seemann)




http://sannybuilder.com/
ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2406) ссылка
    4 декабря 2006, 20:09




Оригинально. 2.99+ - это вчерашняя версия билдера?


ПроцитироватьПроцитировать
Se7en

Добрый Вертикальный беспредельщик
The One Winged Angel


Профиль

Затемнить
Оценил игр: 12
Репутация: 2974 [-][+]

 Re: FAQ по Mission Builder (Ответ #2407) ссылка
    5 декабря 2006, 04:58




2.99+ - это все версии СБ, начиная с 2.99 и выше, заканчивая 2.99d, на данный момент.


ПроцитироватьПроцитировать
Seemann
Добрый Император


Профиль

Затемнить
Оценил игр: 24
Репутация: 992 [-][+]

 Re: FAQ по Mission Builder (Ответ #2408) ссылка
    5 декабря 2006, 09:18




2Se7en:
это все версии СБ, начиная с 2.99 и выше, заканчивая 2.99d, на данный момент
Угу, только их всего две и было: 2.99 (сентябрь 2006), 2.99d (декабрь 2006). 2.99с я не считаю, потому как это та же D, только с мемхаком inside.

2Katyа:
Что насчет работоспособности кода, ты не проверяла?

btw, небольшое пояснение по коду. Для изменения других переменных, кроме 10@ как в примере, нужно менять команду

inc(0@, 40)

где 40 - это номер переменной, умноженной на 4.

В оптимизированном варианте (в спойлере), нужно менять строку

000A: 0@ += 25

где 25 - это номер переменной + 15

Естественно, что в новую переменную можно записывать не только константу, но и содержимое другой переменной: &0(0@,1i) = $var


Редактировалось: 5 декабря 2006, 09:26 (Seemann)




http://sannybuilder.com/
ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2409) ссылка
    5 декабря 2006, 15:51




2Seemann: Что насчет работоспособности кода, ты не проверяла?
Проверила свой мод на новом билдере Да, компиляция мода (деланного на 2.98) в 2.99d работает... но игра не идет как надо. Тот же мейн, компиленный в 2.98 идет так, как запланировано скриптами. Здесь же вперед всех грузит save_done окно и в промежутках показывает надпись "Собственность куплена". Откатилась до 2.98, стало нормально. Что за шморгалка?

Добавление от 5 декабря 2006, 15:52
Там,где смайлик с рожей спецагента в очке - там цифра 8 со скобочкой. Версия 2.98, стало быть.

Редактировалось: 5 декабря 2006, 15:52 (Knuckles)

ПроцитироватьПроцитировать
Seemann
Добрый Император


Профиль

Затемнить
Оценил игр: 24
Репутация: 992 [-][+]

 Re: FAQ по Mission Builder (Ответ #2410) ссылка
    5 декабря 2006, 16:40




2Katyа:
Здесь же вперед всех грузит save_done окно и в промежутках показывает надпись "Собственность куплена". Откатилась до 2.98, стало нормально. Что за шморгалка?
Известная проблема. Решение здесь.





http://sannybuilder.com/
ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2411) ссылка
    5 декабря 2006, 17:02




2Seemann: Известная проблема. Решение здесь.
Вот те на
Спасибо.
Кстати, версия 3 когда выйдет?


ПроцитироватьПроцитировать
Seemann
Добрый Император


Профиль

Затемнить
Оценил игр: 24
Репутация: 992 [-][+]

 Re: FAQ по Mission Builder (Ответ #2412) ссылка
    5 декабря 2006, 18:00




2Katyа:
Не смешно. На предыдущей странице я давал ссылку.

Дата выхода Sanny Builder 3
Кое-что о разработке SB3



Редактировалось: 5 декабря 2006, 18:07 (Seemann)




http://sannybuilder.com/
ПроцитироватьПроцитировать
Seemann
Добрый Император


Профиль

Затемнить
Оценил игр: 24
Репутация: 992 [-][+]

 Re: FAQ по Mission Builder (Ответ #2413) ссылка
    9 декабря 2006, 08:37





Читаем мою новую статью:
[SA] Выполняем ассемблерный код из main.scm



Добавление от 9 декабря 2006, 08:57
Хотите увидеть всю силу данной технологии? Активация любого чита нажатием кнопки Действие!
http://sannybuilder.com/files/cheater.rar



Редактировалось: 9 декабря 2006, 08:57 (Seemann)




http://sannybuilder.com/
ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2414) ссылка
    10 декабря 2006, 23:18




2Seemann:
Понадобилось сделать выгрузку модели, если актер уехал за определенный радиус от нее. Каким опкодом это делается?
if
8205: not actor $PLAYER_ACTOR near_car 0@ radius 25.0 25.0 25.0 unknown 0

подойдет?
Сейчас проверить не имею возможности.


ПроцитироватьПроцитировать
Seemann
Добрый Император


Профиль

Затемнить
Оценил игр: 24
Репутация: 992 [-][+]

 Re: FAQ по Mission Builder (Ответ #2415) ссылка
    11 декабря 2006, 11:53




Что значит выгрузка модели? Строго говоря, это команда
0249: release_model #WMYSGRD


ее можно делать сразу после использования, т.е. например сразу после Car.Create

Если тебе нужно удалить машину, если игрок далеко от нее, то подойдет
Car.RemoveReferences()


машина сама исчезнет, когда игрок отъедет (как обычная машина из траффика).






http://sannybuilder.com/
ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2416) ссылка
    11 декабря 2006, 16:41




Ты не въезжаешь Мне нужен опкод проверки, а не самой выгрузки. Проверки на то, насколько близко к педестриану, ходящему по городу, актёр.


ПроцитироватьПроцитировать
Seemann
Добрый Император


Профиль

Затемнить
Оценил игр: 24
Репутация: 992 [-][+]

 Re: FAQ по Mission Builder (Ответ #2417) ссылка
    11 декабря 2006, 17:08




хмм, а в чем собственно проблема-то?
OST по запросу
% actor near actor --8


выдает как минимум 6 опкодов, выбирай на вкус.





http://sannybuilder.com/
ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2418) ссылка
    11 декабря 2006, 21:31




Проблема в том, что не доходит, куда вставлять в теле скрипта. Схема такая.
1. Создается чел
2. Идет в точку один.
3. Если в точке 1, то идет в точку 2 (и так до n)
4. Если в точке n, то идет в точку один. По кругу так.
Куда вставлять проверку на выгрузку?


ПроцитироватьПроцитировать
Capushon
Добрый Император


Профиль
Сайт
Затемнить
Оценил игр: 0
Репутация: 655 [-][+]

 Re: FAQ по Mission Builder (Ответ #2419) ссылка
    12 декабря 2006, 00:40




2Katyа:
В цикл, туда, где проверка его жизни.

Редактировалось: 12 декабря 2006, 00:41 (Capushon)




Скриптовый мультимод для SA: http://www.capushon.sannybuilder.com/
Сначала ты надежда и гордость, потом о спину ломают аршин  (c)БГ
ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2420) ссылка
    12 декабря 2006, 02:07




2Capushon:
Второй день не дома, игры под рукой нет, поэтому по памяти...
:ABC
name thread

:ABC_0
wait
if
actor dead
jf @ABC_3

:ABC_2
create_actor at ...

:ABC_3
если в точке а, то идет в точку б и т.д.

...

:ABC_nn
выгрузить


Что-то не въезжаю опять...


ПроцитироватьПроцитировать
Capushon
Добрый Император


Профиль
Сайт
Затемнить
Оценил игр: 0
Репутация: 655 [-][+]

 Re: FAQ по Mission Builder (Ответ #2421) ссылка
    16 декабря 2006, 03:42




2Katyа:
:ABC
name thread

:ABC_0
wait
if
actor dead
jf @ABC_3

:ABC_2
create_actor at ...

:ABC_3
если в точке а, то идет в точку б и т.д.

Где же здесь проверки что игрок дошёл до точки Б, что он не сгорел, не утонул, его не сбила машина, не убили, что он не в итрерьере, что вообще на этом острове и что тот, к кому он шел - ещё на месте?
Это всё выполняется в цикле, проверяя так же расстояние к назначению.
...

:ABC_nn
выгрузить






Скриптовый мультимод для SA: http://www.capushon.sannybuilder.com/
Сначала ты надежда и гордость, потом о спину ломают аршин  (c)БГ
ПроцитироватьПроцитировать
Knuckles
Добрый Император


Профиль
E-mail
Сайт
Затемнить
Оценила игр: 4
Репутация: 2912 [-][+]

 Re: FAQ по Mission Builder (Ответ #2422) ссылка
    16 декабря 2006, 14:41




2Capushon:
Я же говорила - не было компьютера. Проверки подразумевала как само собой разумеещееся, соотв., писать их не стала.
Ладно, сама разобралась уже давно.


ПроцитироватьПроцитировать
Seemann
Добрый Император


Профиль

Затемнить
Оценил игр: 24
Репутация: 992 [-][+]

 Re: FAQ по Mission Builder (Ответ #2423) ссылка
    26 декабря 2006, 11:07




Способ, указанный здесь и здесь, можно использовать не только для фиксированных строк, закомпилированных в SCM. Можно также распечатать содержимое стринговых переменных. Это возможно будет полезно при отладке скриптов.

Вот, пример как в цикле выводить имя текущей зоны, в которой находится игрок.

Все тоже самое, что в первом примере, только я читаю имя зоны в переменную через 0843 и передаю указатель на эту переменную (точнее на ту часть main.scm, где хранится ее содержимое). Для этого я устанавливаю конкретное имя переменной через Alloc, чтобы знать как она будет скомпилирована (можно делать через DMA, но с обычными именами читабельнее получается).

:CHEATER
thread 'CHEATER'
 alloc($_asmproc, 76)
 alloc($_param1, 77)

 // set asm injection parameters  
 0@ = -429863          
 &0(0@,1i) = 0xA49960
 &0(0@,1i) += @_asminj
 $_asmproc = 0x588BE0

 // set the asm procedure parameter
 $_param1 = 0xA49A98 // 0xA49960 + 78 * 4 <-> $_zone

 alloc($_zone, 78)
 while true
   00A0: get_actor $PLAYER_ACTOR position_3D_coord_to 0@ 1@ 2@
   0843: get_zone_name_string_from_3D_coord  0@ 1@ 2@ handle_as s$_zone

   // print the variable s$_zone  
   0572: run_asm_injection true
   wait 250
 end

end_thread

 :_asminj
 hex
  FF 35 949AA400                     // push dword ptr [0xA49960+$_param1*4]
  FF 15 909AA400                     // call dword ptr [0xA49960+$_asmproc*4]
  83 C4 04                           // add esp, 4
  C3                                 // return
 end


Скриншот



Добавление от 26 декабря 2006, 11:27

Кстати, нашел в ехе прикольный адрес: номер текущего потока.
Используя его, можно получить позицию в майне => текущий выполняемый опкод. Полезно при зависаниях и падениях игры Надо будет в мемхаке добавить.

Редактировалось: 26 декабря 2006, 11:27 (Seemann)




http://sannybuilder.com/
ПроцитироватьПроцитировать
Capushon
Добрый Император


Профиль
Сайт
Затемнить
Оценил игр: 0
Репутация: 655 [-][+]

 Re: FAQ по Mission Builder (Ответ #2424) ссылка
    26 декабря 2006, 16:30




2Seemann:
Кстати, нашел в ехе прикольный адрес: номер текущего потока. Используя его, можно получить позицию в майне => текущий выполняемый опкод. Полезно при зависаниях и падениях игры
О-оо! Это ооочень полезная фича будет!





Скриптовый мультимод для SA: http://www.capushon.sannybuilder.com/
Сначала ты надежда и гордость, потом о спину ломают аршин  (c)БГ
ПроцитироватьПроцитировать
 Страницы: « 1 ... 93 94 95 96 97 98 99 100 101 ... 103 »
Ответить Начать новую тему
Подписаться на темуПодписаться на тему 
«« Список всех форумов | « Список тем в данном форуме «« | »»         Наверх
Быстрый ответ

Не забывайте пользоваться кнопками быстрого цитирования, находящимися в левой части каждого сообщения.
[>25K?]








  © 1998—2013 Kanobu Network, OOO «Рамблер-Игры».
Все права защищены. Контакты. Реклама на AG. Advertising on AG.ru.
AGFC использует модифицированную версию YaBB
© 2000—2001, X-Null.

Рейтинг.ru Rambler's Top100 RSS-обновления
этой темы форума
    » Что такое RSS?
    » RSS в русской Википедии
 FAQ по скриптингуСегодня 25 июля 2014, 12:22   Новости форумов | Помощь | Правила | Тюрьма