Перейти к содержимому


Фотография

Интересный скрипт миссии "BusMod" by rooft0p, разбор полётов.

скрипт миссии

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 99

#61 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 04 May 2015 - 16:59

Не пойму, о чём ты. Ты же сам скидывал ссылку на этот мод в первом сообщении темы.

Да я про декомпилированный файл того мода, но не суть важно, по сути я уже написал римейк данного мода, так что не актуально.

А вот вообще про декомпилцию dll-лок было бы интересно узнать :)

 

P.S. Пропустил при первом прочтении:

Я использую старый добрый дизассемблер IDA. Благо, что байт-код, используемый виртуальной машиной .NET Framework, содержит много метаданных, что позволяет восстановить исходный код с точностью до названий функций.

Спасибо за ответ! Вопрос про декомпиляцию тоже снят  :)


Сообщение отредактировал vorotkov: 04 May 2015 - 17:21


#62 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 04 May 2015 - 17:27

Да я про декомпилированный файл того мода, но не суть важно, по сути я уже написал римейк данного мода, так что не актуально.
А вот вообще про декомпилцию dll-лок было бы интересно узнать :)

С декомпиляцией я загнул: Hex-Rays такое не проглотит, но дизассемблировать можно. Скидывать файл не вижу смысла (да и я уже за другим компом), ведь проще один раз найти последнюю версию Иды и дизассемблировать всё, что душе угодно.

С декомпиляцией dll всё по-разному бывает, но в этом конкретном случае можно просто открыть файл в Иде и сидеть изучать. Можно ещё какой-нить .Net Reflector попробовать, но тут уж не знаю.

UPD: открыл в рефлекторе: на выходе чистенький и понятный код.

Сообщение отредактировал НикИТОС: 04 May 2015 - 17:37


#63 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 04 May 2015 - 18:28

С декомпиляцией я загнул: Hex-Rays такое не проглотит, но дизассемблировать можно. Скидывать файл не вижу смысла (да и я уже за другим компом), ведь проще один раз найти последнюю версию Иды и дизассемблировать всё, что душе угодно.

С декомпиляцией dll всё по-разному бывает, но в этом конкретном случае можно просто открыть файл в Иде и сидеть изучать. Можно ещё какой-нить .Net Reflector попробовать, но тут уж не знаю.

UPD: открыл в рефлекторе: на выходе чистенький и понятный код.

Для меня это всё пока что тёмный лес, будет чем заняться :lol: , спасибо!



#64 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 19 May 2015 - 21:23

Такой вопрос возник - как изменять направление объекта относительно центра по вертикали? По горизонтали это .Heading:

static void GetObjectHeading(Object obj, f32 *pHeading) { Native::Function::Invoke<ScriptVoid>("GET_OBJECT_HEADING", obj, pHeading); }

static void SetObjectHeading(Object o, f32 value) { Native::Function::Invoke<ScriptVoid>("SET_OBJECT_HEADING", o, value); }



#65 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 20 May 2015 - 06:05

ну поскольку нейтивов типа GET/SET_OBJECT_PiTCH/ROLL нету, ты можешь юзать GET/SET_OBJECT_QUATERNION или GET/SET_OBJECT_ROTATION

#66 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 20 May 2015 - 19:19

Спасибо, попробую.



#67 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 28 May 2015 - 21:21

Подскажите пж-та, как ГТА-скриптом скопировать данные в буфер обмена (например, координаты игрока)? Желательно в синтаксисе VB.NET, но можно и на любом другом.

Пробовал стандартными методами VB.NET:

Запись в буфер: My.Computer.Clipboard.SetText("test string") - выдаёт ошибку скрипта при использовании

Чтение из буфера: My.Computer.Clipboard.GetText() - ошибки не даёт, но и содержимое буфера не выдаёт

Так же в игре пробовал так (предварительно прописав Imports System.Windows.Forms):

Game.DisplayText("Clipboard: " & (Clipboard.GetText()).ToString)

результат был как и выше - ничего из буфера не считалось.



#68 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 29 May 2015 - 07:01

Подскажите пж-та, как ГТА-скриптом скопировать данные в буфер обмена (например, координаты игрока)? Желательно в синтаксисе VB.NET, но можно и на любом другом.
Пробовал стандартными методами VB.NET:
Запись в буфер: My.Computer.Clipboard.SetText("test string") - выдаёт ошибку скрипта при использовании
Чтение из буфера: My.Computer.Clipboard.GetText() - ошибки не даёт, но и содержимое буфера не выдаёт
Так же в игре пробовал так (предварительно прописав Imports System.Windows.Forms):

Game.DisplayText("Clipboard: " & (Clipboard.GetText()).ToString)
результат был как и выше - ничего из буфера не считалось.

Посредством нейтивов этого не сделаешь. Советую написать программу на VB.NET, работающую с буфером обмена, чтобы разобраться, как это всё провернуть. А что ты вообще хочешь организовать? Может, можно это сделать меньшими жертвами?

#69 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 29 May 2015 - 15:41

Да я нейтивами как бы и не пытался, про штатные средства VB.NET и идёт речь, но они выдают ошибку в работе скрипта в НЕТ.Хуке, поэтому и обратился с таким вопросом. Вот тут VcSaJen обращается с буфером обмена, но это через Alice.

А написать пытаюсь сервисный инструментарий для получения данных из игры (например координат) в процессе написания скрипта. Пока делаю всё это через файл, но это двойная работа.



#70 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 29 May 2015 - 16:26

Запись в буфер: My.Computer.Clipboard.SetText("test string") - выдаёт ошибку скрипта при использовании

Что за ошибку? Возможно, dll-ке не хватает привилегий для работы с буфером? Хотя по идее ей должно быть доступно всё, что доступно игре. В общем, настоятельно рекомендую написать отвлечённую прожку, чтоб понять, связан ли трабл с игрой/хуком.

#71 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 29 May 2015 - 18:58

Делал по MSDN Library, конкретно пример кода скрипта:

Imports System
Imports System.Windows.Forms
Imports GTA
Imports System.IO
Imports Microsoft.VisualBasic.FileIO

Public Class GTA_Test
    Inherits Script

    Private Sub Main_KeyDown(ByVal sender As Object, ByVal e As GTA.KeyEventArgs) Handles MyBase.KeyDown
        If e.Key = Keys.NumPad1 Then

            My.Computer.Clipboard.SetText("This is a test string.")             'Выдаёт ошибку в GTA IV в момент нажатия клавиши:
            'Ошибка:
            'Error during Tick in script 'GTA_Test':
            'System.Threading.ThreadStateException: Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.

            Game.DisplayText("Clipboard: " & My.Computer.Clipboard.GetText())   'Ничего не выводит из буфера обмена

            My.Computer.Clipboard.Clear                                         'Выдаёт ошибку в GTA IV, как и с .SetText

        End If
    End Sub
End Class

Перед использованием .GetText и .Clear предварительно загружались текстовые данные в буфер обмена для тестирования.

 

Вот скрин после нажатия клавиши для   My.Computer.Clipboard.SetText("This is a test string.")


Сообщение отредактировал vorotkov: 29 May 2015 - 19:15


#72 VcSaJen

VcSaJen

    Активный участник

  • Пользователи
  • PipPipPip
  • 270 сообщений
  • Пол:Мужчина
  • Интересы:GTA, скриптинг в GTA.


Отправлено 30 May 2015 - 06:03

М, лично я в VB.NET ничего не писал, но попробуй этот пример взамен.
м, нет, это не сработает. Там .net что-то мудрит. Вот тут подробнее написано, как от этого избавиться, но там всё на C#.


Сообщение отредактировал VcSaJen: 30 May 2015 - 06:15


#73 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 30 May 2015 - 09:23

Вот тут подробнее написано, как от этого избавиться, но там всё на C#.

По-моему, этот больше подходит.

#74 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 30 May 2015 - 10:03

Нашёл ещё тут, но пока не понял как это прикрутить к ГТА.

 

ГТА не переваривает вот эту строку (не воспринимает как скрипт, если данная строка присутствует в теле файла-сценария):

Thread clipboardThread = new Thread(somethingToRunInThread);

Просто объявление переменной как поток воспринимает, а заполнение её нет


Сообщение отредактировал vorotkov: 30 May 2015 - 10:45


#75 VcSaJen

VcSaJen

    Активный участник

  • Пользователи
  • PipPipPip
  • 270 сообщений
  • Пол:Мужчина
  • Интересы:GTA, скриптинг в GTA.


Отправлено 30 May 2015 - 11:07

Так нужно в синтаксисе VB.NET это писать. Что-то вроде:
Public Sub somethingToRunInThread()
    System.Windows.Forms.Clipboard.SetText("String to be copied to Clipboard")
End Sub

Protected Sub copy_to_clipboard()
    Dim clipboardThread As New Thread(AddressOf somethingToRunInThread)
    clipboardThread.SetApartmentState(ApartmentState.STA)
    clipboardThread.IsBackground = False
    clipboardThread.Start()
End Sub
(хотя этот код выдал C#->VB Conventer, так что за рабочесть не ручаюсь)

#76 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 30 May 2015 - 11:24

Немного соврал - на VB.NET строка

Dim clipboardThread As New Thread(AddressOf somethingToRunInThread)

не переваривается ГТА, думал и C# выдаст то же, ан нет, там всё работает...

 

Общими стараниями, получился рабочий код занесения данных в буфер обмена для GTA IV на C#:

using System;
using System.Windows.Forms;
using System.Threading;
using GTA;

namespace WorkWithClipboard
{
    public class Main : Script
    {

        public Main()
        {
            Wait(1000);
            this.KeyDown += new GTA.KeyEventHandler(testKeyDown);

        }

        public void testKeyDown(object sender, GTA.KeyEventArgs e)
        {
            if (Keys.E == e.Key)
            {
                copy_to_clipboard();
            }
        }


public void somethingToRunInThread()
{
Clipboard.SetText("String to be copied to Clipboard");
}

protected void copy_to_clipboard()
{
    Thread clipboardThread = new Thread(somethingToRunInThread);
    clipboardThread.SetApartmentState(ApartmentState.STA);
    clipboardThread.IsBackground = false;
    clipboardThread.Start();
}


    }
}

Теперь буду ковырять свой любимый VB.NET на предмет что не так в строке

Dim clipboardThread As New Thread(somethingToRunInThread)


Сообщение отредактировал vorotkov: 30 May 2015 - 14:38


#77 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 30 May 2015 - 11:56

Так нужно в синтаксисе VB.NET это писать. Что-то вроде:

Public Sub somethingToRunInThread()
    System.Windows.Forms.Clipboard.SetText("String to be copied to Clipboard")
End Sub

Protected Sub copy_to_clipboard()
    Dim clipboardThread As New Thread(AddressOf somethingToRunInThread)
    clipboardThread.SetApartmentState(ApartmentState.STA)
    clipboardThread.IsBackground = False
    clipboardThread.Start()
End Sub
(хотя этот код выдал C#->VB Conventer, так что за рабочесть не ручаюсь)

 

Надо же, добавка AddressOf в строку помогло:

Dim clipboardThread As New Thread(AddressOf somethingToRunInThread)

 

А я переводил через http://foxtools.ru/Converter, он выдал такой перевод:

Public Sub somethingToRunInThread()
    System.Windows.Forms.Clipboard.SetText("String to be copied to Clipboard")
End Sub
Protected Sub copy_to_clipboard()
    Dim clipboardThread As New Thread(somethingToRunInThread)
    clipboardThread.SetApartmentState(ApartmentState.STA)
    clipboardThread.IsBackground = False
    clipboardThread.Start()
End Sub

Вот там Dim clipboardThread As New Thread(somethingToRunInThread) и не воспринимала GTA...

VcSaJen, а можно ссылку на конвертер, который ты использовал?


Сообщение отредактировал vorotkov: 30 May 2015 - 11:58


#78 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 30 May 2015 - 12:00

НикИТОС и VcSaJen, большое спасибо за помощь!



#79 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 01 July 2015 - 21:00

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

При одиночной задаче:

Dim Veh1 = World.GetClosestVehicle(Player.Character.Position, 5.0F)
If Exists(Veh1) Then
   Dim passenger1 As Ped
   passenger1.NoLongerNeeded
   passenger1.AttachBlip     'Вешаем визуальный маркер на персонажа
   Native.Function.Call("TASK_HANDS_UP", passenger1, 5000)   'Поднять руки на 5 сек
End If

- игровой персонаж сидя на сиденье транспортного средства поднимает руки, затем через 5с опускает, продолжая сидеть. При значительном отдалении от него, он пропадает (для определения этого момента и вешался маркер на пэда), т.е. .NoLongerNeeded отработал.

 

А вот при использовании списка задач (даже с одной задачей):

Dim Veh1 = World.GetClosestVehicle(Player.Character.Position, 5.0F)
If Exists(Veh1) Then
   Dim passenger1 As Ped
   passenger1.NoLongerNeeded
   passenger1.AttachBlip     'Вешаем визуальный маркер на персонажа
   Native.Function.Call("OPEN_SEQUENCE_TASK")         'Открыть последовательность задач
   Native.Function.Call("TASK_HANDS_UP", passenger1, 5000)   'Поднять руки на 5 сек
   Native.Function.Call("CLOSE_SEQUENCE_TASK")        'Закрыть последовательность задач
   Native.Function.Call("TASK_PERFORM_SEQUENCE")      'Выполнить последовательность задач
   Native.Function.Call("CLEAR_SEQUENCE_TASK")        'Очистить последовательность задач
End If

- игровой персонаж сначала выходит из т/с (сработал встроенный в игру сценарий выполнения .NoLongerNeeded) и только потом он поднимает руки на 5 сек...

 

Как можно с этим бороться?

 

Можно конечно схитрить и перед списком дописать одиночную задачу типа

Native.Function.Call("TASK_STAND_STILL", passenger1, 0)

но, если дальше идёт выполнение списка задач, выскакивает ошибка, работа скрипта при этом не завершается.

 

Кроме того, интересно решение без хитрых ходов ;-)


Сообщение отредактировал vorotkov: 01 July 2015 - 22:27


#80 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 01 July 2015 - 22:05

У тебя нет аргументов нейтивов OPEN_SEQUENCE_TASK, CLOSE_SEQUENCE_TASK, TASK_PERFORM_SEQUENCE и CLEAR_SEQUENCE_TASK. Также, если не ошибаюсь, внутри последовательности задач имя педа заменяется на 0.

Сообщение отредактировал НикИТОС: 01 July 2015 - 23:12





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных