variable sur module

Répondre
Partager Rechercher
Si tu fais demi tour en route (c'est à dire tu pars vers l'est et tu tourne vers l'ouest pour aller à ta zone) ... mais là ça devient vraiment compliqué, ou alors j'ai pas compris ce que tu veux faire ?
Ce n'était pas la question de ce que je voulais faire mais du problème possiblement rencontré.

Ce que je veux faire, c'est faire entrer mon pj dans une zone en fonction de la zone qu'il quitte. C'est à dire s'il quitte la zone par le sud, qu'il entre par le nord de la nouvelle zone.
Mais je me suis rendu compte que ça n'était valable qui s'il quittait la zone par la sortie logique qui menait à la nouvelle zone qu'il souhaitait atteindre (s'il sort par le sud pour se rendre au sud par exemple, mais s'il sort par le sud pour se rendre au nord il y a problème).
Double post, j'ai enfin réglé min problème pour faire apparaître les zones sur la carte du monde lors de l'utilisation d'un point de transition vers la carte du monde.

Il suffit de rajouter ce simple morceau de code à celui du point de transition:

Code PHP:

void main(string  sMapPoint)
{
SetGlobalInt (sMapPoint "_visible"TRUE);

en remplaçant le "sMapPoint" derrière "SetGlobalInt" par le nom de votre zone dans l'éditeur de carte du monde.
Ensuite, pour vérifier la visibilité de la zone, utiliser ce code:

Code PHP:

int StartingConditional(string sMapPoint)
{
return 
GetGlobalInt(sMapPoint "_visible");

Il suffit de l'utiliser dans l'éditeur de carte du monde pour qu'il demande automatiquement le nom de la zone.

(encore merci au tutorial de Sunjammer pour ces infos)

Par contre pour le point d'entrée, je n'arrive toujours pas à faire compiler le script
Désolé de ne pas avoir répondu plus tôt. Pour le script, il manque tout d'abord un ";" à la place du point après "sDestination", ensuite la commande " DespawnAllRosterMembers(TRUE);" me renvoie une erreur "undifined identifier".

Si j'enlève le Despawn... il m'indique des erreures aux lignes
int nDiffX = nPositionX-nOrigineX;
int nDiffY = nPositionY-nOrigineY;

de type "mismatched types".

Je ne vois pas trop ce qui ne va pas ...
Il y a déjà un truc :

Avant le Despawn... tu testes un oDestination qui n'est pas défini avant.
La seule chose que je vois est un string sDestination dans les arguments de la fonction. Donc il y a une erreur à cet endroit ... et comme le compilateur du toolset ne t'indique pas forcément l'erreur à l'endroit ou il la trouve ...
string sWaypoint = IntToString(nDirection)+"_"+sDestination.
object oWaypoint = GetObjectByTag(sWaypoint);

// le point de passage n'existe pas,
// il s'agit donc d'un autre module.
if(oDestination == OBJECT_INVALID)
Ici il faudrait tester l'objet oWaypoint

{
DespawnAllRosterMembers(TRUE);
LoadNewModule("module","wp_destination");
Ici, il faudrait passer un string (2ème argument) qui doit être le sWaypoint défini au dessus
}
// La zone du point de passage est différente,
// on envoie donc le joueur et son groupe.
else if(GetArea(oPC) != GetArea(oDestination))
JumpPartyToArea(oPC,oDestination);
Les 2 lignes remplacer oDestination par oWaypoint
Pb avec DespawnAllRosterMembers(TRUE)

la fonction est DespawnRosterMember, et tu dois lui passer comme argument les noms de tes perso dans le roster

ensuite au début tu soustrais un INT d'un FLOAT, soit tu passes tes nPositionX et nPositionY en INT soit c'est les nOrigineX et Y que tu passes en INT
Désolé pour les 3 posts de suite

Ce qui suit compile

void main(int nPositionX, int nPositionY, string sDestination)
{
object oPC = GetFirstPC();
int nOrigineX = GetLocalInt(oPC,"POSITION_X_CARTE_MONDE");
int nOrigineY = GetLocalInt(oPC,"POSITION_Y_CARTE_MONDE");

int nDiffX = nPositionX-nOrigineX;
int nDiffY = nPositionY-nOrigineY;
int nDirection = 0;
if(abs(nDiffX)>=abs(nDiffY))
{
nDirection = 2;
if(nDiffX<0)
nDirection = 6;
}
else
{
nDirection = 0;
if(nDiffY>0)
nDirection = 4;
}

string sWaypoint = IntToString (nDirection) + "_" +sDestination;
object oWaypoint = GetObjectByTag(sWaypoint);

// le point de passage n'existe pas,
// il s'agit donc d'un autre module.
if(oWaypoint == OBJECT_INVALID)
{
//DespawnRosterMemberDespawnRosterMember(TRUE);
LoadNewModule("module",sWaypoint);
}
// La zone du point de passage est différente,
// on envoie donc le joueur et son groupe.
else if(GetArea(oPC) != GetArea(oWaypoint))
JumpPartyToArea(oPC,oWaypoint);
}
Merci de te donner tout ce mal, j'apprécie !

Je viens de penser à une chose, ce script vérifie le point de sortie de la zone pour choisir le point d'entrée en fonction. Est-il possible en le modifiant légèrement que l'on prenne en compte la position de la zone de sortie sur la carte du monde par rapport à la zone d'entrée sur la carte du monde pour la sélection du waypoint (étant donné que les zones sur la carte du monde ont toutes des coordonnées précises)?
A mon avis ça complique un peu, mais c'est faisable.

Par rapport au DespawnRosterMember, je ne me rappelle plus comment j'avais fait dans mon module, et j'ai tout perdu lors d'une réinstallation.
Claudius33 avait très bien expliqué cela : essaie de faire une recherche sur son nom ?
Le DespawnRosterMember est très important.

S'il n'est pas fait et que le compagnon n'est pas dans le groupe, si le joueur revient par la suite dans le même module, le compagnon reprend le niveau et l'inventaire qu'il avait dans l'ancien module, même s'il a progressé depuis.

Voici exemple tiré de ma future (célèbre ) campagne :

Dans l'exemple il y a en plus une condition qui change le point de destination. j'ai caviardé les noms pour garder le suspens ...

Code PHP:

// travel thru world map (based on a script from Laurence Traill)
// depending on a global variable, may override the target point.

#include "ginc_transition"

int NotInParty(object oPCstring sName)
{
    return (!
GetFactionEqual(oPCGetObjectByTag(sName)));
}

void main(string sModulestring sWP)
{
    
object oPC GetIsObjectValid(GetPCSpeaker()) ? GetPCSpeaker() : OBJECT_SELF;
    
object oTarget;
    
    if ((
sModule == "CY_Azaxxx") && (GetGlobalInt("Entered_Aza")==0)) sWP "WP_init_aza";
    if ((
sModule == "CY_Tinxxx") && (GetGlobalInt("Entered_Tin")==0)) sWP "WP_init_tin";
    if ((
sModule == "CY_Tuxxx") && (GetGlobalInt("Entered_Tum")==0)) sWP "WP_init_tum";
     
    
oTarget GetObjectByTag(sWP);
        
    
// check if the target exists in the current module
    
if(GetIsObjectValid(oTarget))
    {
        
// exists in module: jump the party to the target
        
SinglePartyTransition(oPCoTarget);
    }
    else 
    {
        
// does not exist in module: load the appropriate module and jump the party to the target
        // safety : despawn all companions not in party to clean the module, 
        // otw they may get previous level and inventory when coming back.
        
if (GetJournalEntry("q_nxxxx"oPC)>20)
        {
            if (
NotInParty(oPC"fxxx")) DespawnRosterMember("fxxxl");
            if (
NotInParty(oPC"cxxx")) DespawnRosterMember("cxxx");
            if (
NotInParty(oPC"gxxx")) DespawnRosterMember("gxxx");
            if (
NotInParty(oPC"mxxx")) DespawnRosterMember("mxxx");
        }
        
LoadNewModule(sModulesWP);
    }

Ok, ça a donc de l'importance dans un module (ou une campagne) "persistant", mais vu que dans la mienne, un compagnon qui n'est pas dans le groupe ne peut ni évoluer ni gagner de l'équipement, je peux donc m'en passer ?

Une petite idée pour le point d'arrivée dépendant de la zone de départ et d'arrivée de la carte du monde ?
Si le compagnon n'est jamais utilisé dans le groupe entre le moment où on quitte un module et le moment où on y revient, oui on peut se passer du despawn.

Supposons que depuis la carte on entrer dans le module 1 par défaut au point WP_Nord, on aura en ActionScript dans l'éditeur de carte par exemple le script voyage:

voyage("Module1", "WP_Nord)

Si on veut depuis le module 2 entrer dans le module 1 à un autre point par exemple WP_Sud, il suffit d'avoir un script voyage dans le Module 2 avec une instruction supplémentaire :

void main(string sMod, string sWP)
{
if (sMod=="Module1") sWP = "WP_Sud"
....

On peut aussi rajouter des conditions supplémentaires ou tester une variable locale au module par exemple :

if ((sMod == "Module1") && (GetLocalInt(GetModule(), "Depuis_Sud"))) sWP="WP_Sud"
Il n'y aurait pas un moyen "simple" de juste tester les coordonnées de la zone que l'on quitte par rapport aux coordonnées de la zone que l'on souhaite atteindre (sur la carte du monde je veux dire) ?
De quelles coordonnées parles-tu ? Celles sur la carte du monde ?

Si c'est le cas, tu peux toujours les inscrire en variable locale persistante sur la zone elle-même, ce qui t'offrira un large éventail de solutions. ^^
Oui, je parle bien de celles de la carte du monde. On peut donner une variable locale à la zone ? Je pensais que c'était limité au module.

Si on rajoute des variables locales à chaque zones, peut-on utiliser le script que tu m'as déjà fait plus haut pour les s'en servir ?
Tu peux toujours marquer le joueur une fois qu'il entre dans la zone, en rajoutant par exemple ce bout de code dans l'événement OnEnter (ou OnPlayerLoaded) de la zone :
Code PHP:

object oPC GetEnteringObject();
SetLocalInt(oPC,"POSITION_X_CARTE_MONDE",GetLocalInt(OBJECT_SELF,"POSITION_X_CARTE_MONDE"));
SetLocalInt(oPC,"POSITION_Y_CARTE_MONDE",GetLocalInt(OBJECT_SELF,"POSITION_Y_CARTE_MONDE")); 
Je n'ai pas encore pu essayé ce que tu m'as indiqué, mais je rebondis sur ce post car j'ai une question en rapport avec les variables sur un module. Je sais qu'un module peut avoir un "tag", donc comment je peux modifier une variable sur un module "Z" tout en étant dans le module "A" ?
Répondre

Connectés sur ce fil

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