#1 Re: Работа с памятью, EXE » ФункцииSA EXE 1.0 » 13-01-2014 21:03

А что странного? В коде он так же вызывается (см. 57BA5F - единственное место вызова).

#2 Re: Беседка » С новым годом! » 31-12-2013 20:50

Присоединяюсь, у нас 10 минут до нового года.
Всем счастья, здоровья и успехов в постижении самого трудного! smile

#3 Re: Работа с памятью, EXE » [C++] Загрузка и отрисовка текстур на экран. » 21-11-2013 14:44

Заменил. Вылет остался. В чём у меня проблема, кто-нибудь может ответить?
Место вылета:
QFEguV40ZQUWsuxFNgqvwH_fvWj9uw6w-UhgDtLd7YU

#4 Re: Работа с памятью, EXE » [C++] Загрузка и отрисовка текстур на экран. » 20-11-2013 15:13

А у меня как-то по-другому это сделано? Где у меня ошибка подскажите.

#5 Работа с памятью, EXE » [C++] Загрузка и отрисовка текстур на экран. » 19-11-2013 17:29

Sw[ee]t
Replies: 4

Привет, народ! Сколько лет тут не был, но как симэн взялся за санник, решил заглянуть снова smile.
К делу. Пытаюсь своими силами через c++ вывести текстуру на экран из определённого TXD файла.
За основу взял небезызвестный gta_dll, к процессу игры подключаюсь путём подмены vorbisFile. Всё стандартно, вобщем.
Чудеса начинаются, когда я пытаюсь загрузить текстуру и попытаться отрисовать её по нажатию кнопки.

В самом верху:

CTexture* achievementGetTexture;

Далее, три процедуры отвечающие за загрузку, освобождение и отрисовку текстуры:

void LoadTextures()
{
	int slot = txdStore.AddTxdSlot("achiv");
	txdStore.LoadTxd(slot, "MODELS\\ACHIEV.TXD");
	txdStore.AddRef(slot);
	txdStore.PushCurrentTxd();
	txdStore.SetCurrentTxd(slot);
	achievementGetTexture->Load("ac_box", NULL);
	txdStore.PopCurrentTxd();

	debug("TEXTURE: %x", achievementGetTexture);
	debug("Textures loaded");
}

void ReleaseTextures()
{
	if ( achievementGetTexture ) {
		achievementGetTexture->Clean();
		achievementGetTexture = NULL;
	}
	
	int achievementGetTextureSlotIndex = CTxdStore::FindTxdSlot("achiv");
	txdStore.RemoveTxdSlot(achievementGetTextureSlotIndex);

	debug("Textures released");
}

void Update_Hook()
{
	// Draw texture on demand.
	while ( GetAsyncKeyState(0x09) )
		achievementGetTexture->DrawTexturedRect(&RwRect2D(_width(0), _height(448), _width(280), _height(188)), &RwRGBA(255, 255, 255, 255));
}

Где-то в DllMain:

call(0x5BD765, &LoadTextures, PATCH_CALL);
call(0x53BBCB, &ReleaseTextures, PATCH_CALL);
call(0x53BFAE, &Update_Hook, PATCH_CALL);

Собственно, проблема: при нажатии 0x09 (Tab) игра вылетает. Вылетает из-за того, что почему-то текстура не грузится в мой achievementGetTexture. Вот лог:

20:27:17.680 CTXDSTORE::ADDTXDSLOT([achiv])
20:27:17.681 CTXDSTORE::LOADTXD([4], [MODELS\ACHIEV.TXD])
20:27:17.697 CTXDSTORE::ADDREF([4])
20:27:17.697 CTXDSTORE::PUSHCURRENTTXD
20:27:17.697 CTXDSTORE::SETCURRENTTXD([4])
20:27:17.697 CTEXTURE::LOAD([ac_box], [(null)])
20:27:17.697 CTXDSTORE::POPCURRENTTXD
20:27:17.697 TEXTURE: 0 <-- sic!
20:27:17.697 Textures loaded
20:27:25.692 CTXDSTORE::FINDTXDSLOT([achiv])
20:27:25.692 CTXDSTORE::REMOVETXDSLOT([4])
20:27:25.692 Textures released
20:27:26.092 Log closed

Теперь самое главное: CTexture.h/.cpp, CTxdStore.h.cpp и RW.h/.cpp с определениями текстур и TxdStore.

#define FUNC_CTexture__DrawTexturedRect                        0x728350
#define FUNC_CTexture__Load                                    0x7272B0
#define FUNC_CTexture__Reload                                0x727270
#define FUNC_CTexture__Clean                                0x727240

class CTexture
{
private:
    RwTexture*        texture;

public:
    CTexture()
        : texture(NULL)
    {
    };

    void                DrawTexturedRect(RwRect2D* pos, RwRGBA* color);
    void                Load(const char* name, const char* maskName);    
    void                Clean();

    void                Reload(const char* name);
    void                Reload(const char* name, const char* maskName);

    RwTexture*            GetTexture() { return texture; };
};
#include "StdAfx.h"

void CTexture::DrawTexturedRect(RwRect2D* pos, RwRGBA* color)
{
    debug("CTEXTURE::DRAWTEXTUREDRECT([%.3f %.3f %.3f %.3f], [%i %i %i %i])", pos->x1, pos->y1, pos->x2, pos->y2, color->r, color->g, color->b, color->a);

    DWORD dwFunc = FUNC_CTexture__DrawTexturedRect;
    RwTexture* tex = GetTexture();
    _asm
    {
        push    color
        push    pos
        mov        ecx, tex
        call    dwFunc
    }
}

void CTexture::Load(const char* name, const char* maskName)
{
    debug("CTEXTURE::LOAD([%s], [%s])", name, maskName);

    DWORD dwFunc = FUNC_CTexture__Load;
    _asm
    {
        push    maskName
        push    name
        mov        ecx, this
        call    dwFunc
        mov        [this], eax
        add        esp, 8
    }
}

void CTexture::Clean()
{
    debug("CTEXTURE::CLEAN()");

    DWORD dwFunc = FUNC_CTexture__Clean;
    _asm
    {
        mov        ecx, this
        call    dwFunc
    }
}

void CTexture::Reload(const char* name)
{
    debug("CTEXTURE::RELOAD([%s])", name);

    if ( name ) {
        if ( texture ) {
            RwTexture::Destroy(texture);
            texture = NULL;
        }
        texture = RwTexture::Read(name, NULL);
    }
}

void CTexture::Reload(const char* name, const char* maskName)
{
    debug("CTEXTURE::RELOAD([%s], [%s])", name, maskName);

    if ( name && maskName ) {
        if ( texture ) {
            RwTexture::Destroy(texture);
            texture = NULL;
        }
        texture = RwTexture::Read(name, maskName);
    }
}
#define FUNC_CTxdStore__PushCurrentTxd                        0x7316A0
#define FUNC_CTxdStore__PopCurrentTxd                        0x7316B0
#define FUNC_CTxdStore__FindTxdSlot                            0x731850
#define FUNC_CTxdStore__SetCurrentTxd                        0x7319C0
#define FUNC_CTxdStore__AddTxdRef                            0x731A00
#define FUNC_CTxdStore__AddTxdSlot                            0x731C80
#define FUNC_CTxdStore__RemoveTxdSlot                        0x731CD0
#define FUNC_CTxdStore__LoadTxd                                0x7320B0

class CTxdStore
{
public:
    static void            PushCurrentTxd();
    static void            PopCurrentTxd();
    static int            FindTxdSlot(const char *name);
    static void            SetCurrentTxd(int slot);
    static void            AddRef(int index);
    static int            AddTxdSlot(const char* slotName);
    static void            RemoveTxdSlot(int slot);
    static void            LoadTxd(int slot, const char* fp);
};

static CTxdStore txdStore;
#include "stdafx.h"

void CTxdStore::PushCurrentTxd()
{
    debug("CTXDSTORE::PUSHCURRENTTXD");

    DWORD dwFunc = FUNC_CTxdStore__PushCurrentTxd;
    _asm call dwFunc
}

void CTxdStore::PopCurrentTxd()
{
    debug("CTXDSTORE::POPCURRENTTXD");

    DWORD dwFunc = FUNC_CTxdStore__PopCurrentTxd;
    _asm call dwFunc
}

int CTxdStore::FindTxdSlot(const char *name)
{
    debug("CTXDSTORE::FINDTXDSLOT([%s])", name);

    DWORD dwFunc = FUNC_CTxdStore__FindTxdSlot;
    int result = 0;
    _asm
    {
        push    name
        call    dwFunc
        mov        result, eax
        add        esp, 4
    }
}

void CTxdStore::SetCurrentTxd(int slot)
{
    debug("CTXDSTORE::SETCURRENTTXD([%i])", slot);

    DWORD dwFunc = FUNC_CTxdStore__SetCurrentTxd;
    _asm
    {
        push    slot
        call    dwFunc
    }
}

void CTxdStore::AddRef(int index)
{
    debug("CTXDSTORE::ADDREF([%i])", index);

    DWORD dwFunc = FUNC_CTxdStore__AddTxdRef;
    _asm
    {
        push    index
        call    dwFunc
    }
}

int CTxdStore::AddTxdSlot(const char* slotName)
{
    debug("CTXDSTORE::ADDTXDSLOT([%s])", slotName);

    DWORD dwFunc = FUNC_CTxdStore__AddTxdSlot;
    int result = 0;
    _asm
    {
        push    slotName
        call    dwFunc
        mov        result, eax
        add        esp, 4
    }
}

void CTxdStore::RemoveTxdSlot(int slot)
{
    debug("CTXDSTORE::REMOVETXDSLOT([%i])", slot);

    DWORD dwFunc = FUNC_CTxdStore__RemoveTxdSlot;
    _asm
    {
        push    slot
        call    dwFunc
    }
}

void CTxdStore::LoadTxd(int slot, const char* fp)
{
    debug("CTXDSTORE::LOADTXD([%i], [%s])", slot, fp);

    DWORD dwFunc = FUNC_CTxdStore__LoadTxd;
    _asm
    {
        push    fp
        push    slot
        call    dwFunc
    }
}
...

#define FUNC_RwTexture__Destroy                            0x7F3820
#define FUNC_RwTexture__Read                            0x7F3AC0

struct RwTexture
{
    RwRaster            *raster;
    RwTexDictionary        *txd;
    RwListEntry            TXDList;
    char                name[RW_TEXTURE_NAME_LENGTH];
    char                mask[RW_TEXTURE_NAME_LENGTH];
    unsigned int        flags;
    int                    refs;

    static void            Destroy(RwTexture* texture);
    static RwTexture*    Read(const char* name, const char* maskName);

    RwRaster*            GetRaster() { return this->raster; };
};

...
...

void RwTexture::Destroy(RwTexture* texture)
{
    DWORD    dwFunc = FUNC_RwTexture__Destroy;
    _asm
    {
        push    texture
        call    dwFunc
        add        esp, 4
    }
}

RwTexture* RwTexture::Read(const char* name, const char* maskName)
{
    DWORD        dwFunc = FUNC_RwTexture__Read;
    RwTexture*    result;
    _asm
    {
        push    maskName
        push    name
        call    dwFunc
        add        esp, 8
        mov        result, eax
    }

    return result;
}

...

#6 Re: Работа с памятью, EXE » Добавление иконок » 07-11-2013 21:55

Всё хорошо, исходники бы ещё к этому делу... smile

#7 Re: Модификации » Mods by 444andrei444 » 15-11-2011 13:05

Эдакая незамысловатая реклама ресурса либертисити...

#8 Re: Программы для GTA » scocl - компилятор SCO скриптов для GTA IV » 15-11-2011 13:03

Какое клео4... декомпилятора нормального ещё никто не придумал, а пока его не будет, ни о каком нормальном скриптинге говорить не приходится...

#9 Re: Вопросы по скриптингу » [SA|WIP]episode from san andreas » 08-11-2011 12:38

Какой ужас, я так ждал этот мод, а ты все мои надежды разрушил в один момент...

#11 Re: Вопросы по скриптингу » Один вопрос » 04-11-2011 15:42

Если у тебя конкретная машина (т.е. которая имеет хендл), то просто проверяй её здоровье. А если случайная машина, то тут затрудняюсь ответить.

#12 Re: Вопросы по скриптингу » Один вопрос » 04-11-2011 14:05

Ну можно проверить: что, если, игрок стоит рядом с машиной и имеет опр. оружие в руках, то проверяем здоровье машины. Если игрок рядом с машиной с оружием и здоровье машины уменьшилось - игрок её атаковал.

#14 Re: Работа с памятью, EXE » Улучшенная gta_sa.exe » 02-11-2011 20:13

А какие различия между Си+ и студией (которая использует этот самый си)

#15 Re: Программы для GTA » Really SET Editor (репост из gtamodding.ru) » 01-11-2011 11:23

Обновлено до версии .9-RC1!
Ссылка такая же.

#16 Re: Работа с памятью, EXE » Улучшенная gta_sa.exe » 01-11-2011 04:26

Они основаны на сорсах оригинальной игры

#17 Re: Работа с памятью, EXE » Улучшенная gta_sa.exe » 31-10-2011 20:49

Только осторожней с ним, он 2009го года выпуска; сравнивай его с исходниками MTA и добавляй/поправляй где считаешь нужным smile

#18 Re: Вопросы по скриптингу » Один вопрос » 31-10-2011 15:12

Вот что вышло:

{$CLEO .cs}

0000: NOP

while true
wait 0
if
  Player.Defined($PLAYER_CHAR)
  then
    00BF: 20@ = current_time_hours, 21@ = current_time_minutes 
    if
      09DE: actor $PLAYER_ACTOR entering_car
      then
        0AB5: $PLAYER_ACTOR 5@ 0@ // 5@ - &#237;&#224;&#248;&#224; &#236;&#224;&#248;&#232;&#237;&#224; 0@ - &#225;&#235;&#232;&#230;. &#239;&#229;&#228; (&#226;&#238;&#228;&#232;&#235;&#224; &#237;&#224;&#226;&#229;&#240;&#237;&#238;&#229;)
        if
          5@ <> -1
          then
            01B4: $PLAYER_CHAR 0
            0407: store_coords_to 10@ 11@ 12@ from_car 5@ with_offset 0 0 0 // 10@ - OX 11@ - OY 12@ - OZ
            0407: store_coords_to 13@ 14@ 15@ from_car 5@ with_offset 0 0 0
            0407: store_coords_to 16@ 17@ 18@ from_car 5@ with_offset 0 0 0
            // &#240;&#224;&#237;&#228;&#238;&#236;&#232;&#231;&#232;&#240;&#243;&#229;&#236; &#238;&#244;&#244;&#241;&#229;&#242;&#251; &#228;&#235;&#255; &#234;&#224;&#236;&#229;&#240;&#251;
            0208: 19@ = 2.5 15.8
            0208: 20@ = -5.1 3.4
            0208: 21@ = 2.0 4.0
            0208: 22@ = -4.2 8.6
            0208: 23@ = 1.3 7.2
            // &#239;&#240;&#232;&#241;&#226;&#224;&#232;&#226;&#224;&#229;&#236; &#253;&#242;&#232; &#238;&#244;&#244;&#241;&#229;&#242;&#251;
            005B: 10@ += 19@ // camera coord[1] X
            005B: 11@ += 20@ // camera coord[1] Y
            005B: 12@ += 21@ // camera coord[1] Z
            005B: 13@ += 22@ // camera coord[2] X
            005B: 14@ += 23@ // camera coord[2] Y
            15@ += 1.0 // camera coord[2] Z
            wait 500
            015F: 10@ 11@ 12@ 0 0 0 
            0160: 16@ 17@ 18@ 2
            wait 1500
            015F: 13@ 14@ 15@ 0 0 0
            0160: 16@ 17@ 18@ 2
            wait 500
            01B4: $PLAYER_CHAR 1
            02EB: restore_camera_with_jumpcut
            0373: set_camera_directly_behind_player
            24@ += 1
         end
     end
  end
end
end_thread

#20 Re: Вопросы по скриптингу » Один вопрос » 31-10-2011 13:39

@Voron295 - проблема реально была в отсутствии endа smile:):):):):):):): спасибо

#21 Re: Вопросы по скриптингу » Один вопрос » 31-10-2011 10:34

Когда он открывает дверь; должно меняться положение камеры, до тех пор, пока он не окажется в машине

#23 Re: Вопросы по скриптингу » Один вопрос » 31-10-2011 08:17

Можно на мой вопрос ответить со 158й страницы?

#24 Re: Вопросы по скриптингу » Один вопрос » 30-10-2011 13:35

Проверь, что будет если ввести всё, кроме "AGRU"

#25 Re: Вопросы по скриптингу » Один вопрос » 30-10-2011 10:35

Существуют, поищи. А можно по существу? Что не так в скрипте?
На сколько я понял, он не отрабатывает то, что идёт после actor_entering car...

Board footer

Powered by FluxBB