You are not logged in.
Можно ли значение стринговой переменной перевести в integer
В строках за один символ отвечает один байт ( http://ru.wikipedia.org/wiki/ASCII#.D0. … 0.BA.D0.B0 ). Зная это, можно предложить простой способ решения задачи: 1.читаем значение первого байта строки 2.проверяем, является ли символ цифрой (0x40 > X > 0x29) - если да, то вычитаем 0x30. 3.Записываем результат в переменную-приёмник. 4.Повторяем операции для остальных байтов строки. Результат, помноженный на 10^X, где X - порядковый номер символа в строке, прибавляем к переменной-приёмнику.
Если число может быть отрицательным, то надо предусмотреть возможность чтения символа минуса.
Кстати, не мешало бы ещё знать, сколько разрядов максимум может содержать число.
Целое число word имеет размер 2 байта, следовательно максимальное значение равно 0xFFFF = 65535
Целое число dword имеет размер 4 байта, что соответствует 0xFFFFFFFF = 4294967295
Last edited by Den_spb (28-06-2011 20:02)
Offline
Можно ли значение стринговой переменной перевести в integer
В строках за один символ отвечает один байт ( http://ru.wikipedia.org/wiki/ASCII#.D0. … 0.BA.D0.B0 ). Зная это, можно предложить простой способ решения задачи: 1.читаем значение первого байта строки 2.проверяем, является ли символ цифрой (0x40 > X > 0x29) - если да, то вычитаем 0x30. 3.Записываем результат в переменную-приёмник. 4.Повторяем операции для остальных байтов строки. Результат, помноженный на 10^X, где X - порядковый номер символа в строке, прибавляем к переменной-приёмнику.
Если число может быть отрицательным, то надо предусмотреть возможность чтения символа минуса.Кстати, не мешало бы ещё знать, сколько разрядов максимум может содержать число.
Целое число word имеет размер 2 байта, следовательно максимальное значение равно 0xFFFF = 65535
Целое число dword имеет размер 4 байта, что соответствует 0xFFFFFFFF = 4294967295
Это я собственно и хотел ему предложить) в точности) а насчёт этого:
Кстати, не мешало бы ещё знать, сколько разрядов максимум может содержать число.
я просто неправильно выразился. Я в курсе про максимально возможные значения переменных, я спросил о том, сколько ему надо максимум...
Offline
Спасибо.=)
Offline
@kenking
Вот здесь посмотри, 4 сообщение сверху.
ссылка
Edit: упс, там тоже CLEO4.
Не в тему:
SannyBuilder на китайском
Last edited by DK22Pac (29-06-2011 07:53)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Пул состоит из двух массивов: в обном лежат объекты, в другом - флаги к ним (по байту на объект).
Старший бит этого байта - флаг того, что элемент пула свободен.
Добрался до посмотреть на эти флаги.
0xB74494 - Contains a pointer to main struct
This struct:
+4 = Contains a pointer to a byte map indicating which elements are in use
пытають прочитать
0A8D: 0@ = read_memory 0xB74494 size 4 virtual_protect 0
0@ += 4
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
по идее ведь в 0@ должен записаться указатель на начало массива байтов флажков.
но когда я пытаюсь прочитать что либо из 0@ игра вылетает.
что не так? как эти байтики найти?
Offline
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | while true 003D: 0A8D: 0@ = read_memory 0xB 74494 size 4 virtual_protect 0 inc( 0@ , 4) 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 for 1@ = 0 to 27904 step 0x 100 0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0 inc( 0@ ) if and 2@ >= 0 2@ < 0x 80 then 005A: 2@ += 1@ car.StorePos( 2@ , 3@ , 4@ , 5@ ) 016F: create_particle 2 rotation_factor 0.0 size 1.0 intensity 355 0 0 255 at 3@ 4@ 5@ end end end |
Last edited by DK22Pac (30-06-2011 12:19)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
0A8D: 0@ = read_memory 0xB74494 size 4 virtual_protect 0
inc(0@, 4)
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
....
0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
...
вот так и читал, не был уверенн что это именно те байты.
получаеться что по 0xB74494+4 лежит первый элемент массива, а не указатель pointer to a byte map спасибо
ну и для полного счастья, что значит когда в 0xB74494+12 (количество элементов в vehicle pool) значение -1? вроде количество чего-то должно с 0 начинаться.
Offline
@doxtop
1 2 3 4 5 6 | BYTE * objects; // +0 BYTE * flags; // +4 int size; // +8 int top; // +12 BYTE initialized; // +16 BYTE _f11[3]; // +17, не используется |
по смещению +12 лежит индекс последнего выделенного/освобожденного элемента (чтобы выделение элементов работало быстрее - поиск свободного начинается с top+1).
Offline
Здрасьте, а можно как-нибудь узнать координаты ближайшего "красного маркера"? Именно маркера, а не иконки.
Offline
t]Здрасьте, а можно как-нибудь узнать координаты ближайшего "красного маркера"? Именно маркера, а не иконки.
Если эти маркеры были созданы тобой, то, думаю можно, используя, например, массивы... Т.е. сперва записываешь координаты первого маркера, потом второго и т.д. вот так:
1 2 3 4 5 6 7 | 1@ [1] = 0.0 // координата X для первого маркера 2@ [1] = 0.0 // координата Y для первого маркера 3@ [1] = 0.0 // координата Z для первого маркера 1@ [2] = 1.0 // координата X для второго маркера 2@ [2] = 1.0 // координата Y для второго маркера 3@ [2] = 1.0 // координата Z для второго маркера |
а затем, когда нужно узнать координаты ближайшего маркера применяешь вот такую конструкцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 4@ = 1 actor.StorePos( $PLAYER_ACTOR , 5@ , 6@ , 7@ ) 050A: 9@ = distance_between_XYZ 5@ 6@ 7@ and_XYZ 1@ [ 4@ ] 2@ [ 4@ ] 3@ [ 4@ ] 10@ = 1 // 10@ - указатель на номер маркера, который ближе всего while not 4@ == 10 // 10 - общее кол-во маркеров, ставишь столько, сколько тебе надо 4@ += 1 050A: 8@ = distance_between_XYZ 5@ 6@ 7@ and_XYZ 1@ [ 4@ ] 2@ [ 4@ ] 3@ [ 4@ ] if 8@ < 9@ then 0087: 9@ = 8@ // (float) 0085: 10@ = 4@ // (int) end wait 0 end 1@ [ 10@ ] 2@ [ 10@ ] 3@ [ 10@ ] - координаты ближайшего маркера |
Минус такого способа состоит в довольно большой задержке при поиске. Чем больше маркеров - тем больше задержка.
Last edited by Voron295 (04-07-2011 12:51)
Offline
Ворон, 1@[0] - это 1@, 1@[1] - это 2@ и т.д.. Обсуждалось не раз, что локальные массивы живут в одном блоке с локальными переменными.
Offline
@Voron295 - нет. мне нужно найти ближайший маркер к игроку. созданный скриптовым путём не мной, а мэйном.
Offline
Ворон, 1@[0] - это 1@, 1@[1] - это 2@ и т.д.. Обсуждалось не раз, что локальные массивы живут в одном блоке с локальными переменными.
сорри, забыл об этом...
t]@Voron295 - нет. мне нужно найти ближайший маркер к игроку. созданный скриптовым путём не мной, а мэйном.
понятно...
Offline
Раскройте секрет, как работает
1 | 0893: put_trailer @ on_cab @ |
?
крешит игру при непонятных обстоятельствах.
стопроцентно ставит трейлер только если тягач стоит на месте.
если же ловить машину просто в пуле например и ставить, то 50 на 50. либо поставит либо вывалит игру. скинул бы и логи, но scmlog нифига не пишет после краша. бывают еще варианты ведения логов?
танцы с бубнами типа установки скорости, имунитетов, лока в текущей позиции и видимости как в скрипте T_TRAIL_XX не спасают от вылетов, они вообще даже и не нужны совсем, если создать тягач как car.create() и цеплять к нему прицеп он и так цепляеться на отлично и без дополнительных манипуляций.
банальная запись указателя на трейлер по смещению в тягач тоже не помогла, прицеп не цепляеться, либо я что-то не так сделал, по крайней мере прочитать ее обратно можно было.
хочу заменить его на что-то более внятное и без звука клацания при стыковке.
кода пока под рукой нет, сорри. просто если кто чего копал в этом направлении поделитесь мыслями и ссылочками на инфу
--------
UPD: вопрос по опкоду снимается. скачал компактный ехе, базу и дебугер в котором хоть нифига практически и не понятно, но понятно, что натупил где-то с освобождением созданной тачки. 0893 работает на 100%.
Last edited by doxtop (07-07-2011 00:49)
Offline
Отписываюсь, если вдруг кому-то пригодится. Я недавно просил решить проблему с камерой в моём виде от первого лица - при втором включении камера "срезала" часть тела игрока. Сейчас чисто случайно наткнулся на опкод с подозрительным описанием)) я и раньше его видел, но не придавал ему значения, а тут меня вдруг осенило. Я проверил - работает!) Вобщем вот он:
1 | 041D: set_camera_near_clip 0.1 |
Offline
Помогите пожалуйста..Нашёл косинус нужного угла, а опкода с текстом arccos не нашлось, попробовал ещё 1 способ - так же не получилось.Как можно найти угол, зная его косинус?
Offline
Offline
Seemann,спасибо большое.
Last edited by [ED]Andr (08-07-2011 06:51)
Offline
@[ED]Andr - наверное проще использовать функции C std из msvcrt.dll.
Offline
Alien, проще, но я не умею
Offline
Offline
Погоня с перестрелкой
Крайне извиняюсь, если это уже было, если это элементарно и т.п. Но у меня ничего не получается и время поджимает...
Вообщем мне нужно для миссии код погони.
Итак, имеется машина 3@, в ней водитель 4@ и еще один актер 0@ (стрелок). Эта машина должна ехать к точке (которая находится в другом конце города). Ехать она должна по дороге, но игнорируя светофоры и объезжая машины.
Игрок, находясь на мотоцикле 1@, должен ее преследовать, а друг 2@, сидя позади обстреливать.
Вот то, что я писал:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | Actor.SetImmunities( 0@ ,1,1,1,1,1) Actor.SetImmunities( 4@ ,1,1,1,1,1) Car.SetImmunities( 3@ ,1,1,1,1,1) // создаем маркер Marker.CreateAboveCar( 10@ , 3@ ) Marker.SetColor( 10@ ,5) // восстанавливаем движение в городе 01EB: set_traffic_density_multiplier_to 1.0 03DE: set_pedestrians_density_multiplier_to 1.0 // отключаем широкий экран 02A3: toggle_widescreen 0 // разрешаем игроку двигаться Player.CanMove( $PLAYER_CHAR ) = True // снимаем бессмертие со всех Actor.SetImmunities( $PLAYER_ACTOR ,0,0,0,0,0) Car.SetImmunities( 1@ ,0,0,0,0,0) Actor.SetImmunities( 2@ ,0,0,0,0,0) // восстанавливаем камеру Camera.Restore_WithJumpCut() // разблокировка байка Car.LockInCurrentPosition( 1@ ) = False Car.DoorStatus( 3@ ) = 2 00AE: set_car 3@ traffic_behaviour_to 2 Car.SetToPsychoDriver( 3@ ) 05D1: AS_actor 4@ drive_car 3@ to - 125.807 - 1202.0946 2.6953 speed 25.0 0 model #NULL 0 // перестрелка Actor.WeaponAccuracy( 0@ ) = 60 Actor.WeaponAccuracy( 2@ ) = 75 01B2: give_actor 2@ weapon 28 ammo - 1 01B2: give_actor 0@ weapon 28 ammo - 1 0713: actor 0@ driveby_actor 2@ car - 1 point 0.0 0.0 0.0 radius 5000.0 4 1 firing_rate 40 0713: actor 2@ driveby_actor 0@ car - 1 point 0.0 0.0 0.0 radius 5000.0 4 1 firing_rate 90 |
В итоге, машина останавливается на светофорах, в пробках. А герои плохо стреляют, в смысле, то стреляют то не стреляют, только целятся...
Помогите, пожалуйста, новичку!
Offline
Чтоб стреляли очередями, нужно прописать:
1 | 07DD: set_actor 1@ temper_to 100 // see pedstats.dat |
Чтоб машина не останавливалась на светофорах и объезжала другие машины, нужно поставить:
1 | 00AE: set_car 0@ traffic_behaviour_to 2 |
[small][/small]
Offline
А для VC есть нападобие такого:
1 | 07DD: set_actor 1@ temper_to 100 // |
Offline