ExecuteScript qui fait planter

Répondre
Partager Rechercher
Salut !

Bon, j'avais déjà posté ce sujet il y a quelques mois, mais 1/ j'ai la flemme de rechercher le sujet 2/ j'avais pas été très clair donc autant que je reparte de 0


Voilà donc la situation : pour ouvrir une porte, les joueurs doivent déposer 6 clefs dans 6 réceptacles, suite à quoi la porte s'ouvre et s'ensuit une petite animation.

Lorsqu'on met le bon objet dans le bon réceptacle, un script sur le OnClose du réceptacle va initialiser une variable à 1 sur la porte elle-même, lorsque les 6 variables sont à 1, elle s'ouvre. J'ai ce script sur le OnHeartBeat de la Porte :
Code PHP:

void main()
{
// ici on vérifie si les 6 variables sont à 1

if (GetLocalInt(OBJECT_SELF"key_ak") == 1
    
&&
    
GetLocalInt(OBJECT_SELF"key_cassin") == 1
    
&&
    
GetLocalInt(OBJECT_SELF"key_kag") == 1
    
&&
    
GetLocalInt(OBJECT_SELF"key_konrad") == 1
    
&&
    
GetLocalInt(OBJECT_SELF"key_pp") == 1
    
&&
    
GetLocalInt (OBJECT_SELF"key_thorgal") == 1)
        {

// Petite anim pour l'ouverture des portes, qui ne s'exécute que si la variable si dessous n'est pas à 1 (elle n'y est pas puisqu'elle n'est pas initialisée)
            
if (GetLocalInt(OBJECT_SELF"effect") != 1)
            {
            
DelayCommand(1.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepAk")));
            
DelayCommand(1.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepKonrad")));

            
DelayCommand(2.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepPP")));
            
DelayCommand(2.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepKaG")));

            
DelayCommand(3.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepThorgal")));
            
DelayCommand(3.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepCassin")));

            
DelayCommand(5.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_FNF_SUNBEAM), OBJECT_SELF));

            
DelayCommand(5.0ActionOpenDoor(OBJECT_SELF));

            
SetLocalInt(GetObjectByTag("Ashareth"), "porte_ouverte"1);
            
SetLocalInt(OBJECT_SELF"effect"1); // ici on met la variable à 1 pour que l'anim ne s'exécute qu'une seule fois

            
ExecuteScript("anim_portes"GetFirstPC());
            }
        }

Et donc l'anim des portes marche à la perfection... mais lorsqu'on passe au ExecuteScript, j'ai un beau retour sur le Bureau...

Le script d'anim lui fonctionne très bien aussi, tout seul, lorsqu'il est lancé sur le OnUse d'un placeable, mais ça plante dès que je veux le lancer à partir d'un autre script (même autre que sur le OHB de la porte).

Voilà le script de l'anim :
Code PHP:

object oPC GetFirstPC();
object oAsh GetObjectByTag("Ashareth");

location lSPBal GetLocation(GetObjectByTag("SPW_Bal"));
location lSPGottorp GetLocation(GetObjectByTag("SPW_Gottorp"));
location lSPFlorn GetLocation(GetObjectByTag("SPW_Florn"));
location lSPGrigann GetLocation(GetObjectByTag("SPW_Grigann"));
location lSPWoodblade GetLocation(GetObjectByTag("SPW_Woodblade"));

vector vBal GetPositionFromLocation(lSPBal);

void CreateBal()
{
CreateObject(OBJECT_TYPE_CREATURE"baldurien"lSPBalTRUE);
}

void CreateGhays()
{
CreateObject(OBJECT_TYPE_CREATURE"gottorp"lSPGottorpTRUE);
CreateObject(OBJECT_TYPE_CREATURE"florn"lSPFlornTRUE);
CreateObject(OBJECT_TYPE_CREATURE"woodblade"lSPWoodbladeTRUE);
CreateObject(OBJECT_TYPE_CREATURE"grigann"lSPGrigannTRUE);
}

void main()
{

// Deplacement, orientation et immobilisation du joueur
DelayCommand (0.5AssignCommand (oPCActionForceMoveToObject (GetObjectByTag("WP_AnimPortes"), TRUE)));
DelayCommand (5.0AssignCommand (oPCSetFacing (DIRECTION_NORTH)));
DelayCommand (5.5ApplyEffectToObject(DURATION_TYPE_TEMPORARYEffectCutsceneDominated(), oPC40.0));

// Apparition de Baldurien
DelayCommand (6.0AssignCommand (oAshActionSpeakString("Ca y est enfin ! Les Portes sont ouvertes !")));
DelayCommand (10.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPBal));
DelayCommand (10.0CreateBal());

// Dialogue
DelayCommand (11.0AssignCommand (oAshSetFacingPoint(vBal)));
DelayCommand (11.0AssignCommand (oPCSetFacingPoint(vBal)));
DelayCommand (16.0AssignCommand (GetObjectByTag("Baldurien"), ActionSpeakString("Ashareth ! Arrête tout de suite ! Tu n'as aucune chance !")));
DelayCommand (20.0AssignCommand (oAshActionSpeakString("Trop tard Baldurien ! Tu ne peux plus rien contre nous !")));
DelayCommand (25.0AssignCommand (GetObjectByTag("Baldurien"), ActionSpeakString("Non ! Je ne te laisserais pas détruire le monde !")));

//Apparition des Ghays
DelayCommand (27.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPGottorp));
DelayCommand (27.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPGrigann));
DelayCommand (27.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPFlorn));
DelayCommand (27.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPWoodblade));
DelayCommand (27.0CreateGhays());

//Nouvelle orientation du joueur
DelayCommand (27.0AssignCommand (oPCSetFacing (DIRECTION_NORTH)));

// Dialogue, suite
DelayCommand (30.0AssignCommand (oAshActionSpeakString("Et que compte-tu faire, contre nous tous ?")));
DelayCommand (33.0AssignCommand (GetObjectByTag("Baldurien"), ActionSpeakString("Les Ghays-Lurons ! Mais alors, vous avez tous succombés ?!")));
DelayCommand (35.0AssignCommand (oAshActionSpeakString("Désolé de partir comme ça mais maintenant que nous avons la Dague de Xian en notre posséssion, rien ne nous arrêtera ! BWAHAHAHAHHAAAAHHAAHA !")));

// Disparition des Ghays
effect eVis EffectVisualEffect(VFX_IMP_UNSUMMON);

DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisoAsh));
DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisGetObjectByTag("Gottorp")));
DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisGetObjectByTag("Grigann")));
DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisGetObjectByTag("Florn")));
DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisGetObjectByTag("Woodblade")));

DelayCommand (41.0DestroyObject (GetObjectByTag("Gottorp"), 0.5f));
DelayCommand (41.0DestroyObject (GetObjectByTag("Grigann"), 0.5f));
DelayCommand (41.0DestroyObject (GetObjectByTag("Florn"), 0.5f));
DelayCommand (41.0DestroyObject (GetObjectByTag("Woodblade"), 0.5f));
DelayCommand (41.0DestroyObject (oAsh0.5f));


// Derniere orientation et lancement de la conversation
DelayCommand (45.0AssignCommand (oPCSetFacingPoint(vBal)));
DelayCommand (48.0AssignCommand (GetObjectByTag("Baldurien"), ActionStartConversation(oPC"baldurien")));

Il est long mais rien de spécial pourtant... Comme je le disait, il fonctionne très bien lorsqu'il est lancé tout seul, à partir de tout autre script, le jeu plante...
Vous avez une idée du pourquoi ?
__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
Pourquoi un ExecuteScript plutôt qu'un appel de fonction ? (quitte a mettre la fonction dans une bibliothèque)

Pourquoi faire :
object oPC = GetFirstPC();
Alors que tu appel le script avec l'objet PC en paramètre ? (ici OBJECT_SELF il me semble puisque c'est un execute)

Essai peut-être ca : (le tout en un seul script mais plusieurs fonctions)
Code PHP:

object oAsh GetObjectByTag("Ashareth");

location lSPBal GetLocation(GetObjectByTag("SPW_Bal"));
location lSPGottorp GetLocation(GetObjectByTag("SPW_Gottorp"));
location lSPFlorn GetLocation(GetObjectByTag("SPW_Florn"));
location lSPGrigann GetLocation(GetObjectByTag("SPW_Grigann"));
location lSPWoodblade GetLocation(GetObjectByTag("SPW_Woodblade"));

vector vBal GetPositionFromLocation(lSPBal);

void CreateBal()
{
CreateObject(OBJECT_TYPE_CREATURE"baldurien"lSPBalTRUE);
}

void CreateGhays()
{
CreateObject(OBJECT_TYPE_CREATURE"gottorp"lSPGottorpTRUE);
CreateObject(OBJECT_TYPE_CREATURE"florn"lSPFlornTRUE);
CreateObject(OBJECT_TYPE_CREATURE"woodblade"lSPWoodbladeTRUE);
CreateObject(OBJECT_TYPE_CREATURE"grigann"lSPGrigannTRUE);
}

void anim_portes(object oPC)
{
DelayCommand (0.5AssignCommand (oPCActionForceMoveToObject (GetObjectByTag("WP_AnimPortes"), TRUE)));
DelayCommand (5.0AssignCommand (oPCSetFacing (DIRECTION_NORTH)));
DelayCommand (5.5ApplyEffectToObject(DURATION_TYPE_TEMPORARYEffectCutsceneDominated(), oPC40.0));
DelayCommand (6.0AssignCommand (oAshActionSpeakString("Ca y est enfin ! Les Portes sont ouvertes !")));
DelayCommand (10.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPBal));
DelayCommand (10.0CreateBal());
DelayCommand (11.0AssignCommand (oAshSetFacingPoint(vBal)));
DelayCommand (11.0AssignCommand (oPCSetFacingPoint(vBal)));
DelayCommand (16.0AssignCommand (GetObjectByTag("Baldurien"), ActionSpeakString("Ashareth ! Arrête tout de suite ! Tu n'as aucune chance !")));
DelayCommand (20.0AssignCommand (oAshActionSpeakString("Trop tard Baldurien ! Tu ne peux plus rien contre nous !")));
DelayCommand (25.0AssignCommand (GetObjectByTag("Baldurien"), ActionSpeakString("Non ! Je ne te laisserais pas détruire le monde !")));
DelayCommand (27.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPGottorp));
DelayCommand (27.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPGrigann));
DelayCommand (27.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPFlorn));
DelayCommand (27.0ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPWoodblade));
DelayCommand (27.0CreateGhays());
DelayCommand (27.0AssignCommand (oPCSetFacing (DIRECTION_NORTH)));
DelayCommand (30.0AssignCommand (oAshActionSpeakString("Et que compte-tu faire, contre nous tous ?")));
DelayCommand (33.0AssignCommand (GetObjectByTag("Baldurien"), ActionSpeakString("Les Ghays-Lurons ! Mais alors, vous avez tous succombés ?!")));
DelayCommand (35.0AssignCommand (oAshActionSpeakString("Désolé de partir comme ça mais maintenant que nous avons la Dague de Xian en notre posséssion, rien ne nous arrêtera ! BWAHAHAHAHHAAAAHHAAHA !")));
effect eVis EffectVisualEffect(VFX_IMP_UNSUMMON);
DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisoAsh));
DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisGetObjectByTag("Gottorp")));
DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisGetObjectByTag("Grigann")));
DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisGetObjectByTag("Florn")));
DelayCommand (41.0ApplyEffectToObject (DURATION_TYPE_INSTANTeVisGetObjectByTag("Woodblade")));
DelayCommand (41.0DestroyObject (GetObjectByTag("Gottorp"), 0.5f));
DelayCommand (41.0DestroyObject (GetObjectByTag("Grigann"), 0.5f));
DelayCommand (41.0DestroyObject (GetObjectByTag("Florn"), 0.5f));
DelayCommand (41.0DestroyObject (GetObjectByTag("Woodblade"), 0.5f));
DelayCommand (41.0DestroyObject (oAsh0.5f));
DelayCommand (45.0AssignCommand (oPCSetFacingPoint(vBal)));
DelayCommand (48.0AssignCommand (GetObjectByTag("Baldurien"), ActionStartConversation(oPC"baldurien")));
}

void main()
{
// ici on vérifie si les 6 variables sont à 1

if (GetLocalInt(OBJECT_SELF"key_ak") == 1
    
&& GetLocalInt(OBJECT_SELF"key_cassin") == 1
    
&& GetLocalInt(OBJECT_SELF"key_kag") == 1
    
&& GetLocalInt(OBJECT_SELF"key_konrad") == 1
    
&& GetLocalInt(OBJECT_SELF"key_pp") == 1
    
&& GetLocalInt (OBJECT_SELF"key_thorgal") == 1)
        {
            if (
GetLocalInt(OBJECT_SELF"effect") != 1)
            {
            
DelayCommand(1.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepAk")));
            
DelayCommand(1.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepKonrad")));
            
DelayCommand(2.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepPP")));
            
DelayCommand(2.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepKaG")));
            
DelayCommand(3.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepThorgal")));
            
DelayCommand(3.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_DEATH), GetObjectByTag("RecepCassin")));
            
DelayCommand(5.0ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_FNF_SUNBEAM), OBJECT_SELF));
            
DelayCommand(5.0ActionOpenDoor(OBJECT_SELF));
            
SetLocalInt(GetObjectByTag("Ashareth"), "porte_ouverte"1);
            
SetLocalInt(OBJECT_SELF"effect"1); // ici on met la variable à 1 pour que l'anim ne s'exécute qu'une seule fois

            
Anim_portes(GetFirstPC());
            }
        }

Je ne promet rien, mais ca ne coûte rien d'essayer
Ceci dit, ca n'explique pas le retour sous windows
Oui, j'avais pensé à mettre les deux scripts en un seul, mais vu qu'il sera placé sur le OnHeartBeat, je voulais pas faire trop gros pour pas trop ralentir (un gros script à lire toutes les 6 secondes, ça peut faire ramer...)


Je vais voir ce que ça donne
__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
OK, ça marche et apparemment ça ne ralentit rien du tout...

En fait peut-être que le script ne lit pas les parties qui ne le concerne pas (donc tout ce qui est exécuté avec le if), donc ça ne change pas grand-chose...


Merci !
__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
pis au pire tu peux faire des "return" aux endroits stratégique pour arrêter le onheartbeat
voir même, plutot que de mettre ca dans le onheartbeat de la porte, tu peux faire un

SignalEvent

sur ta porte quand tu met une clée dans ton receptacle, tu test alors tes variables de clée, et si tt est fait tu ouvre
ou tu met direct ca dans le script du receptacle
fin g pas tt lu le script, mais je dis ca comme ca ^_^
Yep, en effet... Je verrais ça si je remarque des ralentissements, mais normalement il ne devrait pas y avoir de problèmes, en fait le module sera assez petit (peu de zones, de scripts etc...), il sert simplement de carrefour avec d'autres modules...

Ou alors si j'ai le temps
__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
Répondre

Connectés sur ce fil

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