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

O temacie

Autor Adanos

Zaczęty 19.11.2016 roku

Wyświetleń 680

Odpowiedzi 11

Adanos

Adanos

Administrator
Szara eminencja
posty5203
Propsy3850
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
Szlachcic
posty2088
Propsy1068
ProfesjaSkrypter
  • Złote Wrota
  • Szlachcic
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.
 


Dodatkowo - odpłatnie pomagam przy zaawansowanych skryptach (AST, UNION, IKARUS).
Po więcej informacji zapraszam na PW na DISCORD.

Splash

Splash

Moderator
posty3952
Propsy3170
ProfesjaNierób
  • Moderator
zCMorphMesh to animowane modele jak łuki i kusze.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...

Mark56

Mark56

Moderator
som veľký magič
posty1617
Propsy1790
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
posty5203
Propsy3850
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
posty3952
Propsy3170
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ę...

Siemekk

Siemekk

Złote Wrota
Szlachcic
posty2088
Propsy1068
ProfesjaSkrypter
  • Złote Wrota
  • Szlachcic
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 ;)
 


Dodatkowo - odpłatnie pomagam przy zaawansowanych skryptach (AST, UNION, IKARUS).
Po więcej informacji zapraszam na PW na DISCORD.

Adanos

Adanos

Administrator
Szara eminencja
posty5203
Propsy3850
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
Szlachcic
posty2088
Propsy1068
ProfesjaSkrypter
  • Złote Wrota
  • Szlachcic
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
 


Dodatkowo - odpłatnie pomagam przy zaawansowanych skryptach (AST, UNION, IKARUS).
Po więcej informacji zapraszam na PW na DISCORD.

pawbuj

pawbuj

Użytkownicy
posty1552
Propsy127
ProfesjaNierób
  • 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
posty3952
Propsy3170
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ę...

pawbuj

pawbuj

Użytkownicy
posty1552
Propsy127
ProfesjaNierób
  • 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