Funkcja sprawdzająca czy NPC wykonał animację 2259 11

O temacie

Autor Adanos

Zaczęty 19.11.2016 roku

Wyświetleń 2259

Odpowiedzi 11

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Czy ktoś kojarzy taką funkcję, która sprawdza, czy dany NPC skończył już wykonywać animację?

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
W samej grze nie istnieje, ale można ją stworzyć dzięki Ikarusowi lub własnej DLL.
W klasach znalazłem to:
int IsAniActive(zSTRING const&)
{
XCALL(0x005A6A40);
};
Nie wiem tylko jak podać ptr, jako obiekt zCMorphMeshProto.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
zCMorphMesh to animowane modele jak łuki i kusze.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
@Adanos v Czasie zapłaty, orc ma funkcje do odczytania nazwy aktualnej animacji. Nie powinno być problemem zrobić sobie perframe sprawdzanie.
 Jak się nazwa zmieni, to wiesz ze animacja była ukończona albo przerwana.
Jeszcze lepsze było by sprawdzać tez numer aktualnej klatki.
 


Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Pamiętasz może nazwę tej funkcji? :D

Ok, znalazłem: oCAniCtrl__GetCurrentAniName. Potem ją obczaję, czy będzie działać w G2.

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Tak, to ona. Sprawdzałem ją kiedyś i nie wiadomo czemu Gothic 2 crashował się przy animacji odskoku w tył z wyciągniętą bronią.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Jest prostszy sposób na sprawdzenie czy animacja jest aktywna.
func int oCNpc_GetModel(var int npc)
{
    CALL__thiscall(MEM_InstToPtr((npc)), oCNpc__GetModel);
    return CALL_RetValAsInt();
};

 
 func int AniIsActive(var c_npc slf, var string aniname)
 {
var int ptr; ptr = oCNpc_GetModel(slf);
const int zCModel_AniIsActive = 5727888;//0x00576690

CALL_zStringPtrParam(Str_Upper(aniname));
CALL__thiscall(ptr,zCModel_AniIsActive);
return CALL_RetValAsInt();
};

Chyba będzie wiadomo jak tego użyć ;) , ale dzięki temu tematowi mam funkcje która pomoże mi naprawić bugi związane ze sprintem ;)
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Wygląda, że działa, ale będę musiał to jeszcze przetestować. Nie wiedziałem, skąd wziąć wartość oCNpc__GetModel, ale znalazłem: http://themodders.org/index.php?topic=10383.msg1256053#msg1256053

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Trochę nie doczytałem :F Ta funkcja sprawdza czy ANIMACJA JEST AKTYWNA W TYM MOMENCIE i zawraca wartość. Najlepiej wywołać "perframe" i sprawdzać prostym "if". Najlepszy efekt(który chcesz osiągnąć) osiągniesz dobierając się do klasy zCModelActive. Struktura:
class zCModelAniActive
{
public:
zCModelAni* m_pAni; //0
zCModelAni* m_pFollowAni; //4
int m_nDirect; //8
float m_fCurFrame; //C
int m_nCurEvent; //10
float m_fCombineX; //14
float m_fCombineY; //18
BOOL m_bFadeOut; //1C
BOOL m_bStarting; //20
zCModelAni* m_pEndAni; //24
float m_fBlendIn; //28
float m_fBlendOut; //2C
zVEC3 m_vPrevPos; //30
zVEC3 m_vNextPos; //3C
zCQuat m_qtPrev; //48
zCQuat m_qtNext; //58
zCQuat m_qtRorate; //68
BOOL m_bRotating; //78
float m_fNumberAni; //7C
void* m_pAttach; //80
float m_fAttachTimer; //84
zCModelAniActive(void)
{
XCALL(0x00576B00);
};

~zCModelAniActive(void)
{
XCALL(0x00576BF0);
};

void SetDirection(zTMdl_AniDir)
{
XCALL(0x00576C10);
};

float GetProgressPercent(void)const
{
XCALL(0x00576C60);
};

void SetProgressPercent(float)
{
XCALL(0x00576CA0);
};

void SetActFrame(float)
{
XCALL(0x00576CF0);
};

void DoCombineAni(zCModel*,int,int)
{
XCALL(0x0057FDB0);
};
};
Chyba ten wskaźnik powinien wystarczyć ;) -m_pEndAni
To chyba najlepszy adres by dostać się do klasy, problem w tym, że nie wiem gdzie szukać funkcji GetActiveAni :I
zCModelAniActive * __thiscall zCModel::GetActiveAni(int)const        0x0057AB60 0 5 public: zCModelAniActive * __thiscall zCModel::GetActiveAni(int)const
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Jest prostszy sposób na sprawdzenie czy animacja jest aktywna.
func int oCNpc_GetModel(var int npc)
{
    CALL__thiscall(MEM_InstToPtr((npc)), oCNpc__GetModel);
    return CALL_RetValAsInt();
};

 
 func int AniIsActive(var c_npc slf, var string aniname)
 {
var int ptr; ptr = oCNpc_GetModel(slf);
const int zCModel_AniIsActive = 5727888;//0x00576690

CALL_zStringPtrParam(Str_Upper(aniname));
CALL__thiscall(ptr,zCModel_AniIsActive);
return CALL_RetValAsInt();
};

Chyba będzie wiadomo jak tego użyć ;) , ale dzięki temu tematowi mam funkcje która pomoże mi naprawić bugi związane ze sprintem ;)
ma ktoś adresy do g1, żeby to działało na pierwszym gothicu?
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Znalezienie tych adresów zajęło mi 5 minut. To nie jest takie trudne, jak się wydaje.
00695300: oCNpc::GetModel
0055CEF0: zCModel::IsAnimationActive
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Znalezienie tych adresów zajęło mi 5 minut. To nie jest takie trudne, jak się wydaje.
00695300: oCNpc::GetModel
0055CEF0: zCModel::IsAnimationActive

dzięki, skorzystałem ze skryptów CZ i tez działa.

Post połączony: 2017-01-06, 14:42
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry