Rebooter une zone quand pas de pj dedans?

Répondre
Partager Rechercher
Je voudrais savoir s'il est possible de rebooter la zone pour qu'elle soit à son état initial quand un joueur en sort?

du style : onexite de la zone

si pas pj dans zone
Alors zone reboot

si autre pj dans zone
Alors rien...

dans un soucis de limiter les ressources du module. Et pour permettre au pj de refaire les quêtes...... correctement !
Sans avoir a bourrer les onhearthbeat des zones pour faire les éboueurs....

Merci pour votre aide..
Oui, tu peux tester avec les OnEnter/OnExit de la zone. Attention, j'avais ça pour une de mes zones et j'avais oublié de tester si le joueur est un DM du coup j'étais venu voir en tant que MdJ si ça marchait bien et quand je suis parti ça a viré tous les PnJs de la zone .

Voici le code de sortie :

Code PHP:

void main()
{
object oObject;
effect eEffect ;
object oPC GetExitingObject() ;

    if (!
GetIsPC(oPC) || GetIsDM(oPC)) return ;

    
eEffect GetFirstEffect(oPC);

    while(
GetIsEffectValid(eEffect))
    {
        if (
GetEffectType(eEffect) == EFFECT_TYPE_INVISIBILITY) {
            
RemoveEffect(oPCeEffect);
        }
        
eEffect GetNextEffect(oPC);
    }
    
oObject GetFirstObjectInArea(OBJECT_SELF) ;
    while (
GetIsObjectValid(oObject)) {
        
int nType GetObjectType(oObject) ;
        if (((
nType == OBJECT_TYPE_CREATURE) && (GetTag(oObject) != "Oreilles")) || (nType == OBJECT_TYPE_PLACEABLE) || (nType == OBJECT_TYPE_ITEM)) {
            
AssignCommand(oObjectSetIsDestroyable(TRUE)) ;
            
DestroyObject(oObject0.1) ;
        }
        
oObject GetNextObjectInArea(OBJECT_SELF) ;
    }

Citation :
Publié par Olblach
Oui, tu peux tester avec les OnEnter/OnExit de la zone. Attention, j'avais ça pour une de mes zones et j'avais oublié de tester si le joueur est un DM du coup j'étais venu voir en tant que MdJ si ça marchait bien et quand je suis parti ça a viré tous les PnJs de la zone .

Voici le code de sortie :

Code PHP:

        if (((nType == OBJECT_TYPE_CREATURE) && (GetTag(oObject) != "Oreilles")) || (nType == OBJECT_TYPE_PLACEABLE) || (nType == OBJECT_TYPE_ITEM)) 

"Oreilles" ? ... Sinon, dans ce script tu zigouilles aussi les placeables au passage, dans quel but les as-tu intégrés à ce nettoyage ? Tu les recréées au prochain OnEnter ?

Sinon, ton script s'applique aussi s'il reste des PC dans la zone. Pour ma part, j'ai mis un compteur de PC sur la zone, si celui-ci passe de 1 à 0 alors après un certain délai je lance la procédure de nettoyage, si dans ce délai un PC est revenu dans la zone, je reporte le nettoyage.
Ah oui, Oreilles c'est un PnJ spécial qui te suis partout et remplace la baguette d'émote, ça te permet d'écrire "/commande" et ça l'exécute. En fait j'ai fini par le virer il m'embêtait parce que ça faisait gourd quand tu sortais d'une maison et que la porte s'ouvrait et se fermait derrière toi^^.

J'ai écrit ça pour l'intro de mon module, le but de la manip pour le joueur étant de traverser les enfers (sans se faire remarquer) pour arriver au point de départ.

Les placeables non je n'en ai pas dans cette zone mais ce code est censé être générique, par exemple une quête avec un coffre, et bien tu le recrées à chaque fois.

Oui, les familiers aussi, bien que dans mon cas, avec deux diantrefosses et un imp dans la zone pas besoin de nettoyage automatique. Ca résiste moins bien qu'un DM généralement^^. J'ai pensé qu'ils devaient sortir avec le PJ mais c'est à vérifier.
Merci

Donc si j'ai bien compris ce script supprime TOUT dans la zone.

Et quand un autre joueur y retourne, TOUT respawn à l'initial ou pas? (pnj plaçable marchand...)

Parceque le but c'est en gros que quand ya personne dans les zones elle soient en standby et qu'elle continu pas à tourner pour rien...
Généralement on se contente de supprimer les PNJ et de les faire repoper quand un nouveau PJ pointe son nez (modulo d'éventuels timers).

C'est ce qui mange le plus de ressources, et c'est aussi ce qui est le plus simple à spawner, parce que bonjour pour remettre par script tous les placeables que le mappeur a passé des heures à ajuster dans la zone

La destruction et le respawn des marchands est aussi possible (pas testé) mais je pense que créer un marchand doit être assez lourd, vu que dans Aurora quand on met un PNJ de la palette dans une zone, il le fait direct, mais quand on met un magasin il y a un petit temps de latence avant de retrouver la main donc j'imagine que spawner un magasin ingame doit donner un petit coup de lag à chaque fois.

Pour mon module les PNJ peuvent être spawnés soit par rencontre classique Bioware (pour les monstres), identifiable avec un GetIsEncounterCreature, soit par un script custom sur la zone (pour les PNJ) qui au moment de spawner le PNJ, lui colle une variable indiquant qu'il est spawné par script.
Au moment où un PJ quitte la zone, le script de nettoyage qui fonctionne avec un compteur de PJ présents, élimine donc tous les PNJ spawnés par rencontre et aussi ceux ayant la variable activée.
Ca évite que les PNJ temporaires spawnés par MD ne soient effacés automatiquement.

Mais autant le script pour tout effacer est simple à faire, autant respawner les PNJ par script demande un peu plus de travail : il faudra référencer les ResRef des PNJ, les waypoints où ils doivent apparaitre, etc.
Liladrielle cette méthode fonctionne bien pour une zone "optionelle" de type quête où un seul PJ (ou groupe de PJ) se rend à la fois. Si certains rentrent pendant que d'autres restent sur place et que d'autres sortent en même temps il faudra un traitement plus conséquent, par exemple avec un compteur comme cela a été mentionné.

C'est à ta charge de créer les PnJ et objets éventuels dans le OnEnter de la zone. Pour info voici celui que j'ai écrit mais ça ne t'aidera pas des masses j'en ai peur^^.

Code PHP:

#include "nw_i0_generic"

void createpotion(object oPC)
{
object oPotion ;
   
oPotion CreateItemOnObject("it_mpotion020"oPC) ;
   
DestroyObject(oPotion60.0) ;
 }

void castinvis(object oPC)
{
effect eInvis EffectInvisibility(INVISIBILITY_TYPE_NORMAL) ;
    
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeInvisoPC300.0) ;
}
void main()
{
object oPC GetEnteringObject() ;
object oToliviel ;
object oTanaria ;
object oLoignar ;
object oWPMidFight GetWaypointByTag("WP_MIDFIGHT") ;
object oWPFight GetWaypointByTag("WP_FIGHT") ;
object oWPFightImp GetWaypointByTag("WP_FIGHTIMP") ;
object oWPFightDiantre GetWaypointByTag("WP_FIGHTDEVIL") ;
object oDiantre1oDiantre2oImp;
string sDB GetLocalString(oPC"DBNAME") ;
int nFaction GetCampaignInt(sDB"FACTION") ;
object oObject;

    if (!
GetIsPC(oPC) || GetIsDM(oPC)) return ;

    
oDiantre1 CreateObject(OBJECT_TYPE_CREATURE,"NW_DEVIL001"GetLocation(GetObjectByTag("WP_DIANTRE1")), TRUE) ;
    
oDiantre2 CreateObject(OBJECT_TYPE_CREATURE,"NW_DEVIL001"GetLocation(GetObjectByTag("WP_DIANTRE2")), TRUE) ;
    
oImp CreateObject(OBJECT_TYPE_CREATURE,"NW_IMP"GetLocation(GetObjectByTag("WP_IMP")), TRUE) ;
    switch (
nFaction) {
    case 
1:
        
oToliviel CreateObject(OBJECT_TYPE_CREATURE,"pnj_toliviel"GetLocation(oPC), TRUE) ;
        
AssignCommand(oTolivielActionWait(2.0));
        
AssignCommand(oTolivielActionSpeakString("Des Diantrefosses! Tout est perdu ! Va, et accomplis ton destin pendant que je les retiens."TALKVOLUME_WHISPER ));
        
AssignCommand(oTolivielActionCastFakeSpellAtObject(SPELL_INVISIBILITYoPC)) ;
        
AssignCommand(oTolivielActionDoCommand(castinvis(oPC))) ;
        
AssignCommand(oTolivielActionMoveToObject(oWPMidFightTRUE)) ;
        
AssignCommand(oImpActionWait(20.0));
        
AssignCommand(oImpActionMoveToObject(oWPFightImpTRUE)) ;
        
AssignCommand(oDiantre1ActionWait(25.0));
        
AssignCommand(oDiantre1ActionMoveToObject(oWPFightDiantreTRUE)) ;
        break ;
    case 
3:
        
oTanaria CreateObject(OBJECT_TYPE_CREATURE,"pnj_tanaria"GetLocation(oPC), TRUE) ;
        
AssignCommand(oTanariaActionWait(2.0));
        
AssignCommand(oTanariaActionSpeakString("Tiens tiens des Diantrefosses.. comme c'est intéressant. Je vais leur parler et toi dépêche toi de sauter dans ce trou avant qu'ils ne décident s'il faut te rôtir ou te faire bouillir dans la lave !" ));
        
AssignCommand(oTanariaActionCastFakeSpellAtObject(SPELL_INVISIBILITYoPC)) ;
        
AssignCommand(oTanariaActionDoCommand(castinvis(oPC))) ;
        
AssignCommand(oTanariaActionForceMoveToObject(oWPMidFightTRUE)) ;
        
AssignCommand(oTanariaActionForceMoveToObject(oWPFightTRUE)) ;
        
AssignCommand(oTanariaActionWait(10.0));
        
AssignCommand(oTanariaActionSpeakString("Je suis Tanaria, grande prêtresse de Lolth et j'exige que vous me laissiez passer !")) ;
        
AssignCommand(oTanariaActionWait(15.0));
        
AssignCommand(oTanariaActionSpeakString("Tes paroles m'ont rendue furieuse ! TU VAS LE REGRETTER !")) ;
        
AssignCommand(oTanariaActionDoCommand(ChangeToStandardFaction(oTanariaSTANDARD_FACTION_DEFENDER))) ;
        
AssignCommand(oTanariaActionAttack(oImp)) ;
        
AssignCommand(oTanariaActionDoCommandSetCommandable(TRUE) ));
        
AssignCommand(oTanariaSetCommandable(FALSE));
        
AssignCommand(oTanariaActionDoCommand(DetermineCombatRound(oImp)));
        
AssignCommand(oImpActionWait(20.0));
        
AssignCommand(oImpActionForceMoveToObject(oWPFightImpTRUE)) ;
        
AssignCommand(oImpActionWait(10.0));
        
AssignCommand(oImpActionDoCommand(SpeakString("Tanaria telemara ! Hihihihihihihihihi !"))) ;
        
AssignCommand(oImpActionDoCommandSetCommandable(TRUE) ));
        
AssignCommand(oImpSetCommandable(FALSE));
        
AssignCommand(oDiantre1ActionWait(25.0));
        
AssignCommand(oDiantre1ActionForceMoveToObject(oWPFightDiantreTRUE)) ;
        
AssignCommand(oImpActionWait(7.0));
        
AssignCommand(oDiantre1ActionDoCommand(SpeakString("Silence femelle !Tu n'entreras pas vivante dans le royaume de notre maitre !"))) ;
        
AssignCommand(oDiantre1ActionDoCommandSetCommandable(TRUE) ));
        
AssignCommand(oDiantre1SetCommandable(FALSE));
        break ;
    case 
2:
        
oLoignar CreateObject(OBJECT_TYPE_CREATURE,"pnj_loignar"GetLocation(oPC), TRUE) ;
        
DelayCommand(6.0AssignCommand(oLoignarActionSpeakString("Sacripan des Diantrefosses ! Bon, bois cette potion et cours pendant que je m'occupe d'eux."TALKVOLUME_WHISPER )));
        
DelayCommand(6.1createpotion(oPC)) ;
        
DelayCommand(12.1AssignCommand(oLoignarActionMoveToObject(oWPMidFightTRUE))) ;
        
DelayCommand(12.2AssignCommand(oImpActionMoveToObject(oWPFightImpTRUE))) ;
        
DelayCommand(12.3AssignCommand(oDiantre1ActionMoveToObject(oWPFightDiantreTRUE))) ;
        break ;
    }

Je viens de découvrir un autre truc. sympa qui peut poser des problèmes :

Si le joueur incarne son familier, il n'est pas détecté avec les commandes GetFirstPC() & GetNextPC. si vous utilisez ces commandes, je pense que ça jetterait ce joueur hors de la zone.
Citation :
Publié par Deyonara
Si le joueur incarne son familier, il n'est pas détecté avec les commandes GetFirstPC() & GetNextPC. si vous utilisez ces commandes, je pense que ça jetterait ce joueur hors de la zone.
Tu es certain/e de cela ?

Si c'est le cas, c'est beaucoup plus ennuyeux qu'il n'y parait car ce problème remettrait en cause également bon nombre de scripts qui parcourent la liste des PC, comme par exemple les diverses sauvegardes persistantes...
Répondre

Connectés sur ce fil

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