Assign command un peu (beaucoup) louche

Répondre
Partager Rechercher
Code PHP:

void UpdateE(object oCreature)
{
    
SendMessageToPC(oCreature"fonction : ok");
    
AssignCommand(oCreatureClearAllActions());
    
AssignCommand(oCreatureActionDoCommand(SendMessageToPC(oCreature"AssignCommand : ok")));
    
AssignCommand(oCreatureActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT1.0f2.0f));

NOTE : dans mon exemple oCreature est toujours un pc

Voila, a l'éxécution, s'affiche "fonction : ok" mais pas "AssignCommand : ok", et l'animation n'est pas executée.

J'ai passé ma matiné la dessus, mais j'ai un peu l'impression d'être tombé sur un big bug signé bioware.... Si vous avez une idée...
Yep, j'ai aussi ce problème sur un script de conversation où le magos fait disparaitre un objet et en recréer un autre.

Code PHP:

ActionPauseConversation();
    
AssignCommandoGuideActionCastFakeSpellAtObjectSPELL_SOUND_BURSToPlaceable));
    
AssignCommandoGuideActionDoCommandDestroyObjectoPlaceable)));
    
AssignCommandoGuideActionCastFakeSpellAtLocationSPELL_SOUND_BURSTlPlaceable));
    
AssignCommandoGuideActionResumeConversation()); 
Doit manquer le createobject dans mon script mais c'est justement pour voir quel type d'assigncommand buggait. Ce script là marche je crois (avec tous ce qui va autour bien-sûr).

Il semblerait que le ActionDoCommand bloque la chaine d'action avec certaines commandes. C'est bizarre

Par exemple un SetLocal* fonctionne avec le ActionDoCommand, avec d'autres non.


Ça donne quoi si tu inverse l'animation avec le sendmessage?
ben je répond sans faire de tests : non, car la ligne
AssignCommand(oCreature, ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT, 1.0f, 2.0f));
ne marche pas non plus...
Je pense que tu peut virer tes AssignCommand.

Code PHP:

void UpdateE()
{
    
SendMessageToPCOBJECT_SELF"fonction : ok");
    
ClearAllActions();
    
SendMessageToPCOBJECT_SELF"AssignCommand : ok");
    
ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT1.0f2.0f);

Et pour utiliser ta fonction, tu fait:
Code PHP:

AssignCommandoCreatureUpdateE()); 

Hummm... C'est obligé que tout soit transmis dans la chaîne d'action du oCreature? Si oui je me suis un peu planté
Heu... T'es sûr que c'est un script pour Nwn que t'es en train d'faire?? Arf!


Ben heu, j'ai plus trop d'idée...
P'tet que le SendMessageToPC fait tout foirer. Faudrait p'tet donc utiliser FloatingTextStringOnCreature...
heu... ben non le sendmessagetopc je l'ai mis pour le debugging pasque mon PlayAnnimation marchais pas... c'est lui au départ que je veux faire marcher , puis sans ActionDoCommand ca marche pas non plus...



bon ben je crois que la seule solution qu'il me reste c'est la corde a coté de moi.... :/
Code PHP:

SendMessageToPC(oCreature"fonction : ok"); 

ca je le recoit, donc GetIsObjectValid(oCreature) == TRUE

Donc c'est toujours pas ca

Puisque c'est comme ca, je laisse tomber le script éditor, a partir d'aujourd'hui je n'utilise plus que l'assembleur pour programmer sous nwn, na !!!
Heu... ta fonction marche impec chez moi...

Code PHP:

void UpdateE(object oCreature)
{
    
SendMessageToPC(oCreature"fonction : ok");
    
AssignCommand(oCreatureClearAllActions());
    
AssignCommand(oCreatureActionDoCommand(SendMessageToPC(oCreature"AssignCommand : ok")));
    
AssignCommand(oCreatureActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT1.0f2.0f));
}

void main()
{
    
object oPC GetLastUsedBy();
    
UpdateEoPC);

Ça viendrait d'où alors?

Ch'te lôche pô tant qu'on a pô trouvé!
ben je vais te mettre le script en entier :

Code PHP:

void UpdateEvanouis()
{
    
ClearAllActions();
    
ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT1.0f2.0f);
    
ActionDoCommand(UpdateEvanouis());
}

void TombeEvanouis(int nCauseobject oCreaturefloat fDuration=0.0f)
{
    
int nEvanouis GetLocalInt(oCreature"Evanouis");
    if(
nEvanouis nCause)
    {
        
AssignCommand(oCreatureUpdateEvanouis());
        
SetCommandable(FALSEoCreature);

        if(
nCause == EVANOUIS_CAUSE_TEMPORAIRE)
        {
            
DelayCommand(fDurationNonEvanouisParCause(oCreaturenCause));
        }

        if(
nCause >= EVANOUIS_CAUSE_EMORAGIE)
        {
            
//Perte de points de vie
        
}

        
SetLocalInt(oCreature"Evanouis"nCause);
    }
}

void main()
{
    
object oPC GetLastUsedBy();
    
SendMessageToPC(oPC"file : ok");
    
TombeEvanouis(10oPC);

pendre : voila voila, c'est un peu plus complexe que ce que tu as mis , et je ne comprend TOUJOURS PAS pourquoi ca marche pas Y_Y

Code PHP:

if(MarcheChez(oSkanzo) || LaisseTomber(oSkanzooAzrael)) AssignCommand(oAzraelActionSeTireUneBalle());
if(
TrouveSolution(oSkanzo)) AssignCommand(oAzraelActionRemerci(oSkanzoREMERCIMENT_INFINIMENT)); 
Je peux te poser une question idiote ?


tu met un SetCommandableFalse, c'est ca ?

Parceque pour ce que j'en sait, ca n'empeche pas le controle, mais ca empeche de remplir la pile d'action (ce qui revient au meme, sauf que ca ni*** ton truc, normalement...)

Essaye de faire pareil, mais en Mettant Un SetCommandableTrue avant ta pile d'action, et un DelayCommand(SetCommandable(FALSE)) apres...



enfin, encore une fois, c'est comme ca que j'ai toujours fait avec SetCommandable...
Mouarf, vi, c'est exactement ça

J'allais répondre quand au même moment j'ai vu la réponse de Raistlin. Excellent!

Pô besoin de tester le script, not'modo trouve direct le truc qui foire


Au résultat t'es bloqué Azra, paske t'arrivera jamais à faire passer ta boucle d'action tant que SetCommandable sera FALSE

Je crois que j'avais vu quelque pôrt un truc pour qu'une animation LOOPING tourne en rond tout le temps, du genre je met 0.0f à une des valeurs...
Ouaip, ok pour ca, je savais pas (dailleur c'est pas terrible qu'on ne puisse pas toucher a la chaine d'action par scripts... :/ enfin passons)

Mais lorsque l'action est lacée pour la première fois, le "SetCommandable" n'est pas encore a FALSE .....

Enfin je vais essayer quand même, on sais jamais, mais je vois pas pourquoi ca marcherais...

EDIT : ben oui bien sur, la ligne du dessus c'est un AssignCommand c'est plus lent qu'un ligne directe..... désolé j'avais la tête ailleur
Ouiaaaaaaaaaaaaaaaaaaaaaa ca marche

en effet, la été le problème.

Je m'excuse humblement auprès de bioware pour tout le mal que j'ai pu dire ou penser d'eux....

Si jamais ca interesse quelqu'un le code débuggé, voila la bibliothèque :

Code PHP:

int GetIsEvanouis(object oCreature)
{
    
int nCause GetLocalInt(oCreature"Evanouis");
    return 
nCause;
}

void UpdateEvanouis()
{
    
SetCommandable(TRUEOBJECT_SELF);

    
ClearAllActions();
    
ActionDoCommand(SetCommandable(FALSEOBJECT_SELF));
    
ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT1.0f3600.0f);
    
ActionDoCommand(UpdateEvanouis());
}

void NonEvanouisParCause(object oCreatureint nCause)
{
    
int nRealCause GetLocalInt(oCreature"Evanouis");
    if(
nRealCause <= nCause)
    {
        
SetCommandable(TRUEoCreature);
        
AssignCommand(oCreatureClearAllActions());
        
DeleteLocalInt(oCreature"Evanouis");
    }
}

void TombeEvanouis(int nCauseobject oCreaturefloat fDuration=0.0f)
{
    
int nEvanouis GetLocalInt(oCreature"Evanouis");
    if(
nEvanouis nCause)
    {
        
AssignCommand(oCreatureUpdateEvanouis());

        if(
nCause == EVANOUIS_CAUSE_TEMPORAIRE)
        {
            
DelayCommand(fDurationNonEvanouisParCause(oCreaturenCause));
        }

        if(
nCause >= EVANOUIS_CAUSE_EMORAGIE)
        {
            
//Perte de points de vie
        
}

        
SetLocalInt(oCreature"Evanouis"nCause);
    }

Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés