La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 02/05/2024 04:03:54


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 15/06/2007 18:07:37 Sujet du message : Script pour tuer un pnj quand un pj est a certaine distance

Bonjour,

J'ai créé un script me permettant de suicider des pnj, sois le pnj part en flamme, soit le pnj meurt et la version non vivante vient a la place. Je passe par des variables locale pour définir la porter du pj avant suicide du pnj, le tag de la version zombie et le type de suicide.

Je me suis dis que si je jouais avec le onPerceive, ça serait bien mieux que du heartbeat.

Bref je me lance et stupéfaction ça semble marcher. Surprised je fais donc un deuxième test de contrôle et ... La raison qui fait que je poste ici ce soir

Mon pnj meurt mais pas a l'écran du client. Il suffit de quitter de zone et revenir pour voir qu'il est bien mort. Enfin ce bug est assez aléatoire et parfois ca marche nickel (ce genre de bug je les hais)

Donc voici le bout de code réduit a son extrême (bug aussi chez moi Sad , enfin j'ai ôté les différentes phase de zombification et immolation)

si quelqu'un pouvait me dire ou se situe le probleme ?

NWScript :
void ActionCreate(string sCreature, location lLoc)
{
    CreateObject(OBJECT_TYPE_CREATURE, sCreature, lLoc);
}

void main()
{ //        SpawnScriptDebugger();

  // ExecuteScript("nw_c2_defa ult2",OBJECT_SELF);

    object oPercep = GetLastPerceived();

    // Distance de percpetion du PJ
    float fDistance = GetLocalFloat(OBJECT_SELF, "Distance");

    // Drapeau pour eviter une execution double des cration de pnj
    int nDejaPasse = GetLocalInt(OBJECT_SELF,"DejaPasse");
    // Choix si le Pj part en fumee ou animee energie necro
    string sTypeMort=GetLocalString(OBJECT_SELF,"TypeMort");
    // Tag de la version necro du vivant
    string sCreature = GetLocalString(OBJECT_SELF, "CORPS_MV");

    effect eMortPNJ = EffectDeath(TRUE,FALSE);
    effect eRappel = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD);
    effect eMortVisuel2 = EffectVisualEffect(VFX_IMP_FLAME_M);

    location lLoc = GetLocation(OBJECT_SELF);

    if (nDejaPasse == FALSE && GetIsPC(oPercep) == TRUE && GetDistanceToObject(oPercep) <= fDistance)
    {
        SetLocalInt(OBJECT_SELF,"DejaPasse",TRUE);

        if(sTypeMort == "Zombie")
        {
            ApplyEffectToObject(DURATION_TYPE_INSTANT,eMortPNJ,OBJECT_SELF);
            ApplyEffectToObject(DURATION_TYPE_INSTANT,eRappel,OBJECT_SELF);
            ActionCreate(sCreature,lLoc);
        }
        else
        {
            ApplyEffectToObject(DURATION_TYPE_INSTANT,eMortVisuel2,OBJECT_SELF);
            ApplyEffectToObject(DURATION_TYPE_INSTANT,eMortPNJ,OBJECT_SELF);
        }
        DestroyObject(OBJECT_SELF,2.0f);
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 18/06/2007 19:28:40 Sujet du message :

*gros soupir*

Bon ben j'ai résolu mon probleme en mettant le script sur le onHeartBeat (enfin modifié) le seul soucis, c'est que la détection se fait toutes les tranches de 6 secondes Sad
_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 19/06/2007 16:21:13 Sujet du message :

Tu fais en sorte que ce soit un void main, tu le mets en une fonction, exemple :

NWScript :
void ActionCreate(string sCreature, location lLoc)
{
CreateObject(OBJECT_TYPE_CREATURE, sCreature, lLoc);
}

void FONCTION(object oPercep)
{ // SpawnScriptDebugger();

// ExecuteScript("nw_c2_defa ult2",OBJECT_SELF);

// Distance de percpetion du PJ
float fDistance = GetLocalFloat(OBJECT_SELF, "Distance");

// Drapeau pour eviter une execution double des cration de pnj
int nDejaPasse = GetLocalInt(OBJECT_SELF,"DejaPasse");
// Choix si le Pj part en fumee ou animee energie necro
string sTypeMort=GetLocalString(OBJECT_SELF,"TypeMort");
// Tag de la version necro du vivant
string sCreature = GetLocalString(OBJECT_SELF, "CORPS_MV");

effect eMortPNJ = EffectDeath(TRUE,FALSE);
effect eRappel = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD);
effect eMortVisuel2 = EffectVisualEffect(VFX_IMP_FLAME_M);

location lLoc = GetLocation(OBJECT_SELF);

if (nDejaPasse == FALSE && GetIsPC(oPercep) == TRUE && GetDistanceToObject(oPercep) <= fDistance)
{
SetLocalInt(OBJECT_SELF,"DejaPasse",TRUE);

if(sTypeMort == "Zombie")
{
ApplyEffectToObject(DURATION_TYPE_INSTANT,eMortPNJ,OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eRappel,OBJECT_SELF);
ActionCreate(sCreature,lLoc);
}
else
{
ApplyEffectToObject(DURATION_TYPE_INSTANT,eMortVisuel2,OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eMortPNJ,OBJECT_SELF);
}
DestroyObject(OBJECT_SELF,2.0f);
}
}

void main()
{
object oPercep = GetLastPerceived();
FONCTION(oPercep);
DelayCommand(1,0, FONCTION(oPercep));
DelayCommand(2,0, FONCTION(oPercep));
DelayCommand(3,0, FONCTION(oPercep));
DelayCommand(4,0, FONCTION(oPercep));
DelayCommand(5,0, FONCTION(oPercep));
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Fait assez rapidement, donc verifie tout.
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 26.38ms