#1 Программирование » Рендер 3D текста на d3d9 » 24-05-2017 15:53

Jack_Savage
Replies: 0

Как отрендерить текст через d3d в Gta SA ?
Сделать просто вывод на экран получилось а вот как рендерить 3d текст (как в сампе Create3dTextLabel) вот этого не могу найти.
Что то нет инфы о том как на directx отрендерить такой текст.
Может вы поможете. Пожалуйста
Только не пишите про gta_sa sdk так как он мне не подходит (без gta он не работает)) ).

#2 Re: Вопросы по скриптингу » Получение названия анимации игрока » 01-03-2017 15:31

DK22Pac wrote:

Jack_Savage, самое простое решение - переустановить студию, при установке выбирать Windows SDK. Ну и поддержку WinXP не забыть.
https://github.com/DK22Pac/plugin-sdk/w … -Community

Ну мне как бы узнавать надо анимку игрока который FindPlayerPed()
Так что сойдет.

А на счет проекта для vs...
Я после 2 часов сделал так что с инклудом plugin.h и using namespace plugin;
У меня нет ошибок при компиле.

Кхм... Были ошибки но смог исправить)

#3 Re: Вопросы по скриптингу » Получение названия анимации игрока » 28-02-2017 20:48

DK22Pac wrote:

plugin.lib получается после сборки проекта plugin_sa в решении plugin-sdk.

Ну буду пробовать подкруть.
А нельзя создавать опкодом бота и через ваш плагин узнавать анимацию ?
Просто там переделать дофига прийдется
PS: Спасибо :3

С ошибками разобрался.
Но есть к вам вопросик.
Если в моем мод есть хук d3d9 и у вас в plugin sdk есть я так понимаю d3d9 хук...
Они же не будут ругаться и выдавать непонятную картинку ?

wCphCP7ffOQ.jpg
Еще раз спасибо :3  smile

#4 Re: Вопросы по скриптингу » Получение названия анимации игрока » 28-02-2017 19:51

DK22Pac wrote:

Нет. Опкоды я визываю через SCM hook в C++

Что значит "аля asi"? Это динамическая библиотека? Чем она подгружается, если не asi-loader'ом?

Кламп это графический обьект RenderWare.

"Взять" его можно в plugin-sdk, подключив хедер RenderWare.h.

Можешь выложить проект со своим плагином, я тебе помогу подключить туда библиотеку и хедеры plugin-sdk.

А не прийдется переписывать мод ? И еще.
Как бы... Я может немного тупой но я не нашел где файл plugin.lib (точно не помню) на гите

Это динамическая библиотека? Чем она подгружается, если не asi-loader'ом?
Да и еще раз да

#5 Re: Вопросы по скриптингу » Получение названия анимации игрока » 26-02-2017 12:58

PS: Спасибо вам за ваш код.
Я тут в MTA нашел... Вашу функцию вот пробую перенести себе ее)

typedef struct RpClump RpClump;
typedef RpClump  *(*RpClumpCallback) (RpClump * clump, void *data);
struct RwObject
{
	unsigned char type;
	unsigned char subtype;
	unsigned char flags;
	unsigned char privateFlags;
	void *parent;                // should be RwFrame with RpClump
};
struct RwListEntry
{
	RwListEntry *next, *prev;
};
struct RwList
{
	RwListEntry root;
};

struct RpClump
{   // RenderWare (plugin) Clump (used by GTA)
	RwObject        object;
	RwList          atomics;
	RwList          lights;
	RwList          cameras;
	RwListEntry     globalClumps;
	RpClumpCallback callback;
};
list < CAnimBlendAssociation *  > m_Associations;
CAnimBlendAssociation * GetAnimBlendAssociation(CAnimBlendAssociationSAInterface * pInterface)
{
	if (pInterface)
	{
		list < CAnimBlendAssociation * > ::iterator iter = m_Associations.begin();
		for (; iter != m_Associations.end(); iter++)
		{
			if ((*iter)->GetInterface() == pInterface)
			{
				return *iter;
			}
		}
		CAnimBlendAssociation * pAssociation = new CAnimBlendAssociationSA(pInterface);
		m_Associations.push_back(pAssociation);
		return pAssociation;
	}
	return NULL;
}

CAnimBlendAssociation * RpAnimBlendClumpGetFirstAssociation(RpClump * pClump)
{
	if (!pClump)
		return NULL;

	CAnimBlendAssociationSAInterface * pInterface;
	DWORD dwFunc = FUNC_RpAnimBlendClumpGetFirstAssociation;
	_asm
	{
		push    pClump
		call    dwFunc
		mov     pInterface, eax
		add     esp, 0x4
	}
	return GetAnimBlendAssociation(pInterface);
}

VS собрала это без ошибок. Для меня это уже достижение  smile
Еще бы сказали где взять RpClump и тогда пробовал или работает это

#6 Re: Вопросы по скриптингу » Получение названия анимации игрока » 26-02-2017 12:06

И еще.
m_pRwClump от куда берется ?
Это id актера или что ?

#7 Re: Вопросы по скриптингу » Получение названия анимации игрока » 26-02-2017 10:47

DK22Pac wrote:

В ванильной - это как?
Ты код в main.scm пишешь?

Нет. Опкоды я визываю через SCM hook в C++ (аля asi) но не хочу юзать плагины.

#8 Re: Вопросы по скриптингу » Получение названия анимации игрока » 26-02-2017 09:54

Та блин... Мне уже даже стыдно что из за меня время на написание или поиск этого потратили.
Я хочу это сделать для ванильной игры.
Вот что именно хочу:
https://youtu.be/38VXY0MMjRU
Делать нечего было... Занимался всякой фигней.
Ну вот хочу сделать синхру ботов.
Типу пишешь в чат команду или какую то кнопку нажымаешь (ну это уже сам сделаю)
И появляется куча ботов которые делают все тоже что и ты. При этом чтобы работало и в сампе и в одиночке.
Думал тупо получать анимку игрока и в цикле ее включать всем ботам.
Сначала думал с исходников сампа взять но там мало того что не понятно так и сделано все под клиент и сервер а мне надо без сервера.
Ну и делаю я это все без плагинов типу вашего.
Даже без библиотеки клео.
Так что мне этот код немного безполезен так как я ее не использую :С

А чтобы получать анимацию я так понял нужно ставить хук на функцию включения анимки и когда игра пытается включить анимку то в том хуке ловить анимку ?
Если да то я это точно не сделаю.
Из собейта фупа или чей он там... Собейт который на asi я 2 дня доставал уже готовы хук на DirectX ибо не мог понять как он вообще работать.

#9 Re: Вопросы по скриптингу » Получение названия анимации игрока » 25-02-2017 22:40

DK22Pac wrote:

Можно сделать новый опкод в .cleo-плагине.

Оу... Нечего не понятно  wow

#10 Re: Вопросы по скриптингу » Получение названия анимации игрока » 25-02-2017 22:34

DK22Pac wrote:

Cпасибо, я не хочу юзать plugin sdk просто я не понимаю что там и как вообще...

Могу опкодами сделать, разве что.

Опкодом узнать какая анимация ?
Или сделать перепод если (там выше писали опкод) такая то анимация то возвращаем что то.
Я опкодом ищу уже 4 день

#11 Re: Вопросы по скриптингу » Получение названия анимации игрока » 25-02-2017 22:14

DK22Pac wrote:

Вот пример с использованием plugin-sdk - вывод списка анимаций игрока.

Main.cpp

#include "plugin.h"
#include "game_sa\common.h"
#include "game_sa\CFont.h"
#include "game_sa\CSprite2d.h"
#include "game_sa\CKeyGen.h"
#include <map>

using namespace plugin;

class AnimNamesViewer {
public:
    AnimNamesViewer() {
        static std::map<unsigned int, std::string> animNamesMap;
        static CdeclEvent<AddressList<0x4CF2D8, H_CALL>, PRIORITY_AFTER, ArgPickN<char *, 0>, unsigned int(char *)> myStoreAnimNameEvent;

        myStoreAnimNameEvent += [](char *name) {
            animNamesMap[CKeyGen::GetUppercaseKey(name)] = name;
        };

        Events::drawingEvent += [] {
            CPed *ped = FindPlayerPed();
            if (ped && ped->m_pRwClump) {
                unsigned int numAnimations = RpAnimBlendClumpGetNumAssociations(ped->m_pRwClump);
                if (numAnimations > 0) {
                    CSprite2d::DrawRect(CRect(SCREEN_COORD_RIGHT(310.0f), SCREEN_COORD(265.0f), SCREEN_COORD_RIGHT(40.0f),
                        SCREEN_COORD(275.0f + 50.0f * numAnimations)), CRGBA(30, 30, 30, 255));
                    CFont::SetAlignment(ALIGN_LEFT);
                    CFont::SetColor(CRGBA(255, 255, 255, 255));
                    CFont::SetOutlinePosition(0);
                    CFont::SetDropColor(CRGBA(0, 0, 0, 255));
                    CFont::SetFontStyle(FONT_MENU);
                    CFont::SetProp(true);
                    CFont::SetWrapx(SCREEN_COORD_MAX_X * 2);
                    CFont::SetBackground(false, false);
                    int counter = 0;
                    CAnimBlendAssociation *association = RpAnimBlendClumpGetFirstAssociation(ped->m_pRwClump);
                    while (association) {
                        static char text[256];
                        sprintf(text, "%d. %s", counter + 1, animNamesMap[association->m_pAnimBlendHierarchy->m_hashKey].c_str());
                        if (association->m_wFlags & 0x10)
                            strcat(text, " (P)");
                        CFont::SetScale(SCREEN_MULTIPLIER(0.6f), SCREEN_MULTIPLIER(1.2f));
                        float width = CFont::GetStringWidth(text, true, false);
                        if(width > SCREEN_COORD(250.0f))
                            CFont::SetScale(SCREEN_MULTIPLIER(0.6f * SCREEN_COORD(250.0f) / width), SCREEN_MULTIPLIER(1.2f));
                        float baseY = SCREEN_COORD(300.0f) + SCREEN_COORD(50.0f) * counter;
                        CFont::PrintString(SCREEN_COORD_RIGHT(300.0f), baseY - SCREEN_COORD(25.0f), text);
                        CSprite2d::DrawRect(CRect(SCREEN_COORD_RIGHT(300.0f), baseY, SCREEN_COORD_RIGHT(50.0f), baseY + SCREEN_COORD(8.0f)),
                            CRGBA(130, 130, 130, 255));
                        CSprite2d::DrawRect(CRect(SCREEN_COORD_RIGHT(300.0f), baseY,
                            SCREEN_COORD_RIGHT(300.0f - association->m_fCurrentTime / association->m_pAnimBlendHierarchy->m_fTotalTime * 250.0f),
                            baseY + SCREEN_COORD(6.0f)), CRGBA(210, 210, 210, 255));
                        association = RpAnimBlendGetNextAssociation(association);
                        ++counter;
                    }
                    CFont::DrawFonts();
                }
            }
        };
    }
} animNamesView;

http://i.imgur.com/d2DHIZjm.jpg

При желании можно оформить в виде опкода.

Cпасибо, я не хочу юзать plugin sdk просто я не понимаю что там и как вообще...

Ну хотя...
unsigned int numAnimations = RpAnimBlendClumpGetNumAssociations(ped->m_pRwClump);
Это я так понимаю id, hash или что то там... что меняется зависимо от анимации ?

#12 Re: Вопросы по скриптингу » Получение названия анимации игрока » 25-02-2017 20:41

Через чит енджин посмотрел...
Я думал она меняется зависимо от анимации а оказалось том только эти 5 состояний :С

#14 Re: Вопросы по скриптингу » Получение названия анимации игрока » 25-02-2017 17:33

Goldfish wrote:

в Cped есть еще некоторые статусы анимы. Но наверно ты про это знеаешь...

CPed +0x15C = Some anim states:
0 = landing from jump
61 = punching
102 = stopped
154 = sprint
205 = run
Это ?
Ну и как мне узнать какая анимация у игрока ?
Тут только 5 статусов и это статусы а не анимации. Я правильно понимаю ?

#15 Re: Вопросы по скриптингу » Получение названия анимации игрока » 25-02-2017 15:44

DK22Pac wrote:

Ну хотя бы название.

А хеш не хочешь?

Есть опкод

0611:   is_char_playing_anim 2@ anim "LRGIRL_IDLE_TO_L0"

Он сверяет все анимации, прицепленные к клампу, по хешу названия.
Если не залезать в дебри, можно предположить, что имена анимаций нигде не сохраняются (вместо них - хеши).
Можно составить таблицу связок хеш-имя, но это уже выходит за рамки скриптинга.

То есть нельзя узнать какая анимация проигруется на боте ?
Хоть какую то инфу...
ID, хеш, название....
Что то что можно потом сравнить с уже заготовленими значениям.
Какой язык не имеет значения C++ Cleo (так то на С++ надо но как то переведу).

Хочу что то типу как в сампе GetPlayerAnimation

#16 Re: Вопросы по скриптингу » Получение названия анимации игрока » 24-02-2017 15:59

Goldfish wrote:

Чо?
Про библиотеку так и не понял. А названия всех анимаций есть в сети.
Проще запустит Gta anim manager и открыть архив с анимациями и там увидеть все названия анимы с ее воспроизведением на экране.

Мне нужно в скрипте узнать какая анимация у игрока (или бота) сейчас проигруется.
При этом именно получать а не проверять вклучена такая анимка или нет

#17 Вопросы по скриптингу » Получение названия анимации игрока » 21-02-2017 12:44

Jack_Savage
Replies: 27

Как поулчить название анимации и ее библиотеку в CLEO ?
Ну хотя бы название.
Подскажите пожалуйста.

#18 Вопросы по скриптингу » Переход на нулевой оффсет. » 06-11-2016 15:55

Jack_Savage
Replies: 0
{$CLEO}
:ST
wait 0
if
0AB0: pressed_key 35
jf @ST
:Jep
0AF8: samp add_message_to_chat "??????" color 0xFFFFFF
jump @Jep

Подскажите что это вообще за ошибка такая ?

#19 Вопросы по скриптингу » Переход на нулевой оффсет. » 06-11-2016 15:55

Jack_Savage
Replies: 2
{$CLEO}
:ST
wait 0
if
0AB0: pressed_key 35
jf @ST
:Jep
0AF8: samp add_message_to_chat "??????" color 0xFFFFFF
jump @Jep

Подскажите что это вообще за ошибка такая ?

#20 Вопросы по скриптингу » Вывод текста на экран » 04-11-2016 16:27

Jack_Savage
Replies: 1

Есть такой вопрос.
Как вывести на экран к примеру "Привет" ?
В стандартном mail.scm не нашел.
PS: Это все нужно без клео

Board footer

Powered by FluxBB