Instanciation de zones

Répondre
Partager Rechercher
Bonjour-bonjour!

Je suis en train de bosser sur une cinématique en ce moment, et je galère un peu avec l'instanciation d'une zone

1/ Impossible de supprimer une créature via DestroyObject après la création de l'instance :
La créatures est bien récupérée, et je peux appeler pas mal de fonctions dessus (ApplyEffectToObject, SetPlotFlag, ...) mais DestroyObject ne fonctionne jamais.
Délayer la destruction ne change rien.
Du coup plutôt que de détruire la créature, je la tue. Mais la solution ne me convient pas vraiment..

2/ Impossible de détruire l'instance avec DestroyObject
Je fais sortir le PJ de la zone, et j'appelle ensuite DestroyObject, mais l'instance n'est pas détruite

3/ Impossible d'instancier la zone plus d'une fois
Quand j'essaye de faire deux instances d'une zone, le 2e appel à la fonction CreateInstancedAreaFromSource renvoi un OBJECT_INVALID


Je vous laisse mon code :

Création de l'instance et téléportation du joueur
Code PHP:

void TPJoueur(object oPCobject oNPC)
{
    
FadeToBlack(oPC3.0);

    
object oDocks GetObjectByTag("eauprofonde_docks");
    if(!
GetIsObjectValid(oDocks)){SendMessageToPC(oPC"Erreur : Impossible de récupérer la zone des docks");return;}
    
    
object oInstancedArea CreateInstancedAreaFromSource(oDocks);
    if(!
GetIsObjectValid(oInstancedArea)){SendMessageToPC(oPC"Erreur : La zone instanciée est invalide");return;}
    
SetTag(oInstancedArea"eauprofonde_docks_instanced");
    
    
//Nettoyage et verrouillage de la zone
    
object oObj GetFirstObjectInArea(oInstancedArea);
    while(
GetIsObjectValid(oObj))
    {
        
int nType GetObjectType(oObj);
        switch(
nType)
        {
            
//Suppression des créatures
            
case OBJECT_TYPE_CREATURE
                
DebugMsg("Deleting "+GetName(oObj)+" ("+GetTag(oObj)+")");
                
SetScriptHidden(oObjFALSE); 
                
SetPlotFlag(oObjFALSE);
                
AssignCommand(oObjSetIsDestroyable(TRUEFALSEFALSE));
                
DestroyObject(oObj0.0FALSE); //L'appel ne fonctionne pas
                
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDeath(), oObj);
                break;

            
//Fermeture à clé des portes
            
case OBJECT_TYPE_DOOR
                
SetLocked(oObjTRUE); 
                
SetLockKeyRequired(oObjTRUE); 
                
SetLockKeyTag(oObj"INVALID");
                break;

            
//Suppression des triggers
            
case OBJECT_TYPE_TRIGGER:
                if(
GetTag(oObj) != "bgaurile3_visionracailles")
                    
DestroyObject(oObj0.0FALSE); 
                break;

            
//Désactivation des plaçables utilisables (ex: plaques d'égout)
            
case OBJECT_TYPE_PLACEABLE:
                
SetUseableFlag(oObjFALSE);
                break;
        }
        
oObj GetNextObjectInArea(oInstancedArea);
    }

    
//TP du PJ et Gend
    
object oWPEtalPoissonerie GetObjectByTagInArea("BGAURILE3_ETALPOISSONERIE"oInstancedArea);    
    if(
GetIsObjectValid(oWPEtalPoissonerie))DebugMsg("WP de destination valide");else DebugMsg("WP de destination INVALIDE");
    
location lEtalPoissonerie GetLocation(oWPEtalPoissonerie);
    
DelayCommand(3.0AssignCutsceneActionToObject(oPCJumpToLocation(lEtalPoissonerie)));
    
    
DelayCommand(3.0DestroyObject(GetObjectByTagInArea("sergent_gend"GetArea(oPC))));
    
DelayCommand(3.0CreateObjectDelayable(OBJECT_TYPE_CREATURE"sergent_gend_conv"lEtalPoissonerie));

Le PJ part de l'instance et celle ci est détruite
Code PHP:

void PJQuitteInstance(object oPCobject oNPC)
{
    
object oInstancedArea GetArea(oPC);
    
    
FadeToBlack(oPC3.0);

    
//On dégage le PJ
    
DelayCommand(3.0AssignCutsceneActionToObject(oPCActionJumpToLocation(GetLocation(GetObjectByTag("SPAWN_MORIARTY")))));

    
//Destruction de la zone instanciée
    
AssignCommand(oInstancedAreaSetIsDestroyable(TRUEFALSEFALSE));
    
DelayCommand(10.0DestroyObject(oInstancedArea));
    
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDeath(), oInstancedArea);
    
    
DelayCommand(20.0BGAurile3PrintInfo(GetArea(oPC)));

Note : Les scripts ci dessus utilisent ces fonctions
Code PHP:

//Envoie sMessage à tous les joueurs connectés au server
//Utile pour débugger les fonctions
//
//Crom
void DebugMsg(string sMessage)
{
    
object oPC GetFirstPC();
    while(
GetIsObjectValid(oPC))
    {
        
SendMessageToPC(oPCsMessage);
        
oPC GetNextPC();
    }
}

//Renvoie le 1er objet correspondant au tag sTag et situé dans la zone oArea
// Le fonctionnement est similaire à GetObjectByTag(...)
//Crom
object GetObjectByTagInArea(string sTagobject oAreaint nth=0)
{
    
int i=0;
    
object oObj=GetObjectByTag(sTag0);
    while(
nth>=&& GetIsObjectValid(oObj))
    {
        if(
GetArea(oObj) == oArea)
            
nth--;
            
        if(
nth<0)break;
        
        
i++;
        
oObj=GetObjectByTag(sTagi);
    }
    return 
oObj;

Quelqu'un a t'il des idées?
Bon j'essaie également de mon côté, c'est bien foireux comme fonction !

Première analyse: j'arrive à instancier plusieurs fois une zone sans soucis; évidemment elle n'apparaît dans le client DM qu'après un restart. Ce serait trop simple.
Citation :
J'ai ça qui traine dans un script d'exit area

Code:
AssignCommand(oObject, SetIsDestroyable(TRUE,FALSE,FALSE));
DestroyObject(oObject);
Mais il y a peut être des pré-réragles à faire sur le PNJ en palette
C'est un peu ce que j'ai fait non? ^^
Code PHP:

AssignCommand(oObjSetIsDestroyable(TRUEFALSEFALSE));
DestroyObject(oObj0.0FALSE); 
Note : le PNJ se supprime sans problèmes en MD. Seule la destruction via le script et DestroyObject ne fonctionne pas.

Citation :
Bon j'essaie également de mon côté, c'est bien foireux comme fonction !

Première analyse: j'arrive à instancier plusieurs fois une zone sans soucis; évidemment elle n'apparaît dans le client DM qu'après un restart. Ce serait trop simple.
T'es sûr d'avoir bien instancié deux fois la zone d'origine?
Si on ne change pas le tag de la zone instanciée, c'est celle ci qui vient en 1er avec GetObjectByTag, et non la zone d'origine
(Dixit Laban : https://forums.jeuxonline.info/showt...4#post21421794)
Citation :
Publié par Crom29
T'es sûr d'avoir bien instancié deux fois la zone d'origine?
Si on ne change pas le tag de la zone instanciée, c'est celle ci qui vient en 1er avec GetObjectByTag, et non la zone d'origine
(Dixit Laban : https://forums.jeuxonline.info/showt...4#post21421794)
Oui à priori. Dans le cas contraire, ça n'aurait pas marché selon ce que dit Laban, non ? J'ai instancié la zone où était mon personnage, lorsque je suis retourné sur le module en DM il y avait 5 fois la zone en question dans le sélecteur. Je regarderais plus en détail ce soir.
Ca m'enerve... ça marche pour de petites zones presque vides, mais pour la grosse zone que je veux instancier, ça ne fonctionne pas...
Finalement je me suis débrouiller sans instanciation, mais c'est un peu dommage :/
__________________
http://img.xooimage.com/files21/b/4/0/bann_lcda-500x100-12abc53.gif
Répondre

Connectés sur ce fil

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