La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 01/11/2024 14:37:07


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Nicetios
Seigneur
Inscrit le: 20 Juin 2004
Messages: 217
Répondre en citant
Posté le : 20/09/2005 16:24:54 Sujet du message : [Réso] Vidage de zones

Bonjour ,

Voilà, je voudrai mettre en place sur le onexit des différentes zones de mon module ceci :

NWScript :
void main()
{
//DECLARATION DES VARIABLES
object oPCexiting=GetExitingObject();
object oAreaLeaved = OBJECT_SELF;
object oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
object oFirstPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
int nNBdePC = GetLocalInt(oAreaLeaved,"nNBdePC");

//Mise a jour du Compteur
if (GetIsPC(oPCexiting))
{
nNBdePC = nNBdePC-1;
SetLocalInt(oAreaLeaved,"nNBdePC",nNBdePC);
}

//TEST POUR VERIFIER SI IL RESTE DES PC DANS L'Area

if (nNBdePC == 0)
{

//BOUCLE DE DESTRUCTION DES CREATURES/ITEM
while (GetIsObjectValid(oObjetaDetruire))
{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_CREATURE)||
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_ITEM)
)
{
DestroyObject (oObjetaDetruire);
}
oObjetaDetruire=GetNextObjectInArea();
}
}

//LOG~DEBUG
}
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.


Donc jusque là tout va bien .je voudrais que la fonction se répète 20 secondes plus tard, donc un petit ActionWait (20) dont j'ignore si l'utilisation est judicieuse . ( les 20 secondes pour détruire les loots des monstres , le temps qu'ils se décomposent )

NWScript :
void main()
{
//DECLARATION DES VARIABLES
object oPCexiting=GetExitingObject();
object oAreaLeaved = OBJECT_SELF;
object oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
object oFirstPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
int nNBdePC = GetLocalInt(oAreaLeaved,"nNBdePC");

//Mise a jour du Compteur
if (GetIsPC(oPCexiting))
{
nNBdePC = nNBdePC-1;
SetLocalInt(oAreaLeaved,"nNBdePC",nNBdePC);
}

//TEST POUR VERIFIER SI IL RESTE DES PC DANS L'Area

if (nNBdePC == 0)
{ ActionWait (400);
                   

//BOUCLE DE DESTRUCTION DES CREATURES/ITEM
while (GetIsObjectValid(oObjetaDetruire))
{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_CREATURE)||
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_ITEM)
)
{
DestroyObject (oObjetaDetruire);
}
oObjetaDetruire=GetNextObjectInArea();
}
ActionWait (20); //POUR PERMETTRE DESTRUCTION OBJETS LOOTS ( decomposition cadavre oblige )

while (GetIsObjectValid(oObjetaDetruire))
{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_ITEM)
)
{
DestroyObject (oObjetaDetruire);
}
oObjetaDetruire=GetNextObjectInArea();
}
}


//LOG~DEBUG
}
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.


Là tout va bien ( du mois je pense que ca marche, cher grand spécialiste vous pouvez signaler toute erreur.

Ensuite, c'est là que ca se corse. Je voudrais en effet que soient épargnés mes créatures " boss " si jamais elles ont spawn, car leur temps de respawn est très long .
Donc je voudrai en fait faire commencer leur tag de la façon suivante :

BOSS_tagdumonstre

et epargner tous les monstres qui n'ont pas le tag BOSS_xxxxxxxx

j'avais pensé à qq du genre : ( emprunté sur un autre script )

NWScript :
while(GetIsObjectValid(oObjetaDetruire))
        {
            sTag = GetTag(oObjetaDetruire);
            sRecupTag = GetStringLeft(sTag, FindSubString(sTag,"_"));

            if(GetObjectType(oObjetaDetruire) == OBJECT_TYPE_CREATURE
            && sRecupTag != "BOSS")
                DestroyObject(oItem);
}
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.


Mais voilà mes essai d'insertion se révèle ... infructueux. Si vous pouviez me donner une piste ....
Merci.

Amicalement,
Nicetios,
( petit débutant : rang petit scarabé en nwnscript )
_________________
Luttons contre le language SMS !
Nicetios : Le monde d'Yhgdrazil serveur nwn 1 up, serveur nwn 2 en developpement. Venez nous voir ! Venez decouvrir un autre monde !
[http]
Dernière édition par Nicetios le 20/09/2005 18:09:57; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers
Répondre en citant
Posté le : 20/09/2005 17:33:53 Sujet du message :

Tu fait le test avec ça
NWScript :
if(GetStringLeft(GetTag(oObjetaDetruire), 5) != "BOSS_")
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.

_________________
Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Nicetios
Seigneur
Inscrit le: 20 Juin 2004
Messages: 217
Répondre en citant
Posté le : 20/09/2005 17:38:26 Sujet du message :

hum je ne vois pas où tu veux que je l'insère , désolè , c'est la fin de la journée je fatigue un peu .

[ EDIT ] non c'est bon Embarassed désolè je crois savoir , quel boulet en fin de journée ...
_________________
Luttons contre le language SMS !
Nicetios : Le monde d'Yhgdrazil serveur nwn 1 up, serveur nwn 2 en developpement. Venez nous voir ! Venez decouvrir un autre monde !
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Nicetios
Seigneur
Inscrit le: 20 Juin 2004
Messages: 217
Répondre en citant
Posté le : 20/09/2005 17:51:43 Sujet du message :

En fait , ton idée marche . Il faut affiner maintenant. En fait, le problème de ta solution, c'est que tous les placeables sont détruits, si ils sont utiliseables, et je n'ai pas la patience de mettre des tags en BOSS_ à tous les placeables...
En revanche, il épargne bien les BOSS_ donc le système marche.
Une idée ?

un
NWScript :
&& GetObjectType(oObjetaDetruire) == OBJECT_TYPE_CREATURE
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.

ne serait il pas le bienvenu ?
_________________
Luttons contre le language SMS !
Nicetios : Le monde d'Yhgdrazil serveur nwn 1 up, serveur nwn 2 en developpement. Venez nous voir ! Venez decouvrir un autre monde !
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers
Répondre en citant
Posté le : 20/09/2005 17:58:00 Sujet du message :

Oui bien sûr tu cantonne le test avec les créatures Razz
A ta place je ferais meme une petite fonction qui check tout le points a remplir pour détruire ou non l'objet, si c'est bon -> TRUE sinon FALSE.
_________________
Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Nicetios
Seigneur
Inscrit le: 20 Juin 2004
Messages: 217
Répondre en citant
Posté le : 20/09/2005 18:05:17 Sujet du message :

Ca y est , version finale et qui marche ( pour ceux qui serait interessés )

NWScript :


//Nicetios et Ivellios
//Le 20/09/05

void main()
{
//DECLARATION DES VARIABLES
object oPCexiting=GetExitingObject();
object oAreaLeaved = OBJECT_SELF;
object oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
object oFirstPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
int nNBdePC = GetLocalInt(oAreaLeaved,"nNBdePC");

//Mise a jour du Compteur
if (GetIsPC(oPCexiting))
{
nNBdePC = nNBdePC-1;
SetLocalInt(oAreaLeaved,"nNBdePC",nNBdePC);
}

//TEST POUR VERIFIER SI IL RESTE DES PC DANS L'Area

if (nNBdePC == 0)
{
ActionWait(1.1);
}
{
 

//BOUCLE DE DESTRUCTION DES CREATURES
while (GetIsObjectValid(oObjetaDetruire))
{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_CREATURE)
)
if(GetStringLeft(GetTag(oObjetaDetruire), 5) != "BOSS_")

DestroyObject (oObjetaDetruire);
}
oObjetaDetruire=GetNextObjectInArea();
}
ActionWait (20.1); //POUR PERMETTRE DESTRUCTION OBJETS LOOTS ON RELANCE LA FONCTION MAIS SUR LES OBJETS ITEMS INVENTAIRE ( decomposition cadavre oblige )

while (GetIsObjectValid(oObjetaDetruire))

{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_ITEM)
)
{
DestroyObject (oObjetaDetruire);
}
oObjetaDetruire=GetNextObjectInArea();
}
}


//LOG~DEBUG
}/* suspect block end found !*/
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.


En fait, comme ca ca peut paraître barbare comme solution mais ca marche ^.^ , de ce fait je ne vais pas allourdir le script avec des test TRUE/FALSE car je me cantone aux créatures ( mod de 240 zones, je n'ai pas besoin de détruire mes placeables ^^ )
Ce va me permettre de souffler après le passage des joueurs !
Merci Ivellios.
_________________
Luttons contre le language SMS !
Nicetios : Le monde d'Yhgdrazil serveur nwn 1 up, serveur nwn 2 en developpement. Venez nous voir ! Venez decouvrir un autre monde !
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 21/09/2005 00:22:01 Sujet du message :

Je suppose que tu as aussi un script sur le OnEnter pour compter les PJs qui rentrent dans la zone ?
sinon jette un oeil à la fonction ci-dessous et au lien en bas : il y a des fonctions de comptages de PJs dans une zone qui sont faciles d'emploi et d'origine bioware. D'autres fonctions également pour les bodybags, les monstres et les items.

Avec cette fonction tu n'auras pas à maintenir le décompte des PJs dans une variable.

ex : int NoPlayerInArea(object oArea) (Note : elle est simplifiable, elève le message de debug au milieu)
NWScript :
// * returns true if there is no player in the area
// * has to be ran from an object
// source xp2 module modifie
int NoPlayerInArea(object oArea) {
    object oFirst = GetFirstObjectInArea(oArea) ;
    if( GetIsPC(oFirst) || GetIsDM(oFirst) || GetIsDMPossessed(oFirst) ) return FALSE ;
    // pour le cas ou le seul objet est un PC
    if( !GetIsObjectValid(oFirst) ){
      SendMessageToAllDMs("Erreur : no valid object for GetFirstObjectInArea") ;
      return TRUE;
    }
    object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oFirst);
    return !GetIsObjectValid(oPC); // * no player in area
}
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.


GarbageCollector
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Nicetios
Seigneur
Inscrit le: 20 Juin 2004
Messages: 217
Répondre en citant
Posté le : 21/09/2005 08:19:03 Sujet du message :

J'utilise une fonction simplisime : Smile

NWScript :
//Script de compte PJ a mettre sur le ON ENTER de la transition

void main()
{
//Declaration des variables
object oPCentering = GetEnteringObject();
object oAreaEntered = OBJECT_SELF;
int nNBdePC = GetLocalInt(oAreaEntered,"nNBdePC");

//Incrementation du compteur de PC dans l'area
if (GetIsPC(oPCentering))
{
nNBdePC = nNBdePC+1; //Nombre de PJ + 1 , afin de pouvoir savoir cb il y en a.
SetLocalInt(oAreaEntered, "nNBdePC",nNBdePC);
}
}
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.


Qui est légèrement plus simple a apréhender pour celui qui voudrais utiliser ce système.
Merci quand même !
_________________
Luttons contre le language SMS !
Nicetios : Le monde d'Yhgdrazil serveur nwn 1 up, serveur nwn 2 en developpement. Venez nous voir ! Venez decouvrir un autre monde !
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 21/09/2005 12:57:38 Sujet du message :

Tu es sûr que ton test sur OBJECT_TYPE_ITEM détruit les plaçables "loot" ?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Nicetios
Seigneur
Inscrit le: 20 Juin 2004
Messages: 217
Répondre en citant
Posté le : 21/09/2005 13:09:23 Sujet du message :

Certain, c'est testé . En fait, les loots mettent un petit temps pour apparaître, donc je les " dell " derrière. ce sont des " item " donc cette fonction leur est consacrée. Si je met autre chose, je détruit les placeables useable, ce qui est ennuyeux dans mes zones Smile

[edit] les paceables ne sont pas des loots et vice versa ! loots = objets d'inventaires lachés par un monstre en mourant.
_________________
Luttons contre le language SMS !
Nicetios : Le monde d'Yhgdrazil serveur nwn 1 up, serveur nwn 2 en developpement. Venez nous voir ! Venez decouvrir un autre monde !
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 21/09/2005 16:34:19 Sujet du message : vérification en cours

http://nwn.bioware.com/forums/viewtopic.html?topic=312803&forum=47&highlight=lootable+corpse+tag
http://nwn.bioware.com/forums/viewtopic.html?topic=351002&forum=47

Il conviendrait de vérifier en profondeur donc car le contenu de ces posts ci-dessus indique le contraire : les BodyBag / Remains sont des objets plaçables, mais il y a peut-être eu des changements.
Tu risques de te retrouver avec des loots invisibles apparemment.
Je ferais un test prochainement.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Nicetios
Seigneur
Inscrit le: 20 Juin 2004
Messages: 217
Répondre en citant
Posté le : 21/09/2005 18:47:55 Sujet du message :

Ok, merci en tout cas de ton aide. Si jamais ca devait mal se passer ... Je ferai un ajout , une ligne de plus.
_________________
Luttons contre le language SMS !
Nicetios : Le monde d'Yhgdrazil serveur nwn 1 up, serveur nwn 2 en developpement. Venez nous voir ! Venez decouvrir un autre monde !
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Nicetios
Seigneur
Inscrit le: 20 Juin 2004
Messages: 217
Répondre en citant
Posté le : 21/09/2005 19:48:27 Sujet du message :

En effet, les loots ne disparaissent pas ... erreur de ma part. Une idée ?
Comment sont considérés les loots ? si ce sont des placeables, je suis dans le c***
_________________
Luttons contre le language SMS !
Nicetios : Le monde d'Yhgdrazil serveur nwn 1 up, serveur nwn 2 en developpement. Venez nous voir ! Venez decouvrir un autre monde !
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 21/09/2005 23:03:15 Sujet du message :

humm j'ai testé sur le nwn-ff module en mettant les deux scripts modifiés ci-dessous sur la "Hostile area"

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
//Nicetios et Ivellios
//Le 20/09/05

void main()
{
//DECLARATION DES VARIABLES
object oPCexiting=GetExitingObject();
object oAreaLeaved = OBJECT_SELF;
object oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
object oFirstPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
int nNBdePC = GetLocalInt(oAreaLeaved,"nNBdePC");

//Mise a jour du Compteur
if (GetIsPC(oPCexiting))
{
nNBdePC = nNBdePC-1;
SetLocalInt(oAreaLeaved,"nNBdePC",nNBdePC);
}

//TEST POUR VERIFIER SI IL RESTE DES PC DANS L'Area

if (nNBdePC == 0)
{
ActionWait(1.1);
}
{
 

//BOUCLE DE DESTRUCTION DES CREATURES
while (GetIsObjectValid(oObjetaDetruire))
{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_CREATURE)
)
if(GetStringLeft(GetTag(oObjetaDetruire), 5) != "BOSS_")

DestroyObject (oObjetaDetruire);
SendMessageToPC(oPCexiting,"Objet detruit :"+GetName(oObjetaDetruire)+" "+GetTag(oObjetaDetruire));
}
oObjetaDetruire=GetNextObjectInArea();
}
ActionWait (20.1); //POUR PERMETTRE DESTRUCTION OBJETS LOOTS ON RELANCE LA FONCTION MAIS SUR LES OBJETS ITEMS INVENTAIRE ( decomposition cadavre oblige )

while (GetIsObjectValid(oObjetaDetruire))

{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_ITEM)
)
{
DestroyObject (oObjetaDetruire);
SendMessageToPC(oPCexiting,"Objet detruit :"+GetName(oObjetaDetruire)+" "+GetTag(oObjetaDetruire));

}
oObjetaDetruire=GetNextObjectInArea();
}
}

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.


Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
void main()
{
//Declaration des variables
object oPCentering = GetEnteringObject();
object oAreaEntered = OBJECT_SELF;
int nNBdePC = GetLocalInt(oAreaEntered,"nNBdePC");

//Incrementation du compteur de PC dans l'area
if (GetIsPC(oPCentering))
{
nNBdePC = nNBdePC+1; //Nombre de PJ + 1 , afin de pouvoir savoir cb il y en a.
SendMessageToPC(oPCentering,"Nombre de PJ :"+IntToString(nNBdePC));
SetLocalInt(oAreaEntered, "nNBdePC",nNBdePC);
}
}
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.


Image de Test
Module_Test

Bon ça marche pas en effet, je te donne une piste : tu as oublié de réinitialiser
oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
avant la deuxieme boucle.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 21/09/2005 23:16:40 Sujet du message : POC : proof of content

mais si il n'y avait que celà ...
(...)
re-modif à ma sauce : ensuite je fais des aller-retour dans la zone "hostile area" apres avoir créé 3 scarabés de feu et les avoir détruit, au dernier passage, je prends l'abdomen dans un des BodyBag.

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
//Nicetios et Ivellios
//Le 20/09/05

void main()
{
//DECLARATION DES VARIABLES
object oPCexiting=GetExitingObject();
object oAreaLeaved = OBJECT_SELF;
object oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
object oFirstPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
int nNBdePC = GetLocalInt(oAreaLeaved,"nNBdePC"),n=0;

//Mise a jour du Compteur
if (GetIsPC(oPCexiting))
{
nNBdePC = nNBdePC-1;
SetLocalInt(oAreaLeaved,"nNBdePC",nNBdePC);
}

//TEST POUR VERIFIER SI IL RESTE DES PC DANS L'Area

if (nNBdePC == 0)
{
ActionWait(1.1);
 
 

//BOUCLE DE DESTRUCTION DES CREATURES

ActionWait (20.1); //POUR PERMETTRE DESTRUCTION OBJETS LOOTS ON RELANCE LA FONCTION MAIS SUR LES OBJETS ITEMS INVENTAIRE ( decomposition cadavre oblige )
oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
while (GetIsObjectValid(oObjetaDetruire))

{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_PLACEABLE)
)
{
DestroyObject (oObjetaDetruire);
n++ ;
SendMessageToPC(oPCexiting,"Objet detruit :"+IntToString(n)+" "+GetName(oObjetaDetruire)+" "+GetTag(oObjetaDetruire));

}
oObjetaDetruire=GetNextObjectInArea();
}
}

}
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.


Image de Test_n°2

1°) Les loots bags sont bien des objets plaçables (OBJECT_TYPE_PLACEABLE)
2°) Leur nom en version française est "Restes" et leur Tag est "BodyBag"
3°) Il ne sont pas détruit avec DestroyObject tant qu'il reste quelque chose à l'intérieur*
4°) Ils disparaissent tout seul quand leur inventaire est vide (sauf de temps à autre quand le module est à l'agonie...)**

* même nombre de BodyBag présents dans la zone après un nettoyage
** le Bodybag contenait un abdomen de scarabé de feu que j'ai mis dans mon inventaire, vidant ainsi ce dernier.

Mon conseil : repars sur les 4 fondamentaux ci-dessus.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Seth de Sombrelune
Seigneur
Inscrit le: 10 Jan 2005
Messages: 156
Répondre en citant
Posté le : 23/09/2005 00:04:52 Sujet du message :

Hum... les "BodyBag" sont des plaçables, certe mais placé en intrigue et seule la vidange de leurs inventaire suffit à les faire disparaite, la solution est donc de viré ce status d'intrigue.
Pour ce qui est des créatures de spawns elles on une sorte d'étiquette colée aux fesses , donc tu n'a plus qu'a choisir de detruire les monstres issus de spawns, tes pnj resteront eux.

Voici une proposition de script, il y en a trois en fait, un pour le On-Enter, un pour le On_Exit et une biblio de fonction.

les script on enter/exit commence a appeler les fonctions, tu place ce que tu veux ensuite.

On_Enter :

NWScript :
#include "eboueur_zones"

void main()
{
  // APPEL DU NETTOYEUR
  enter_eboueur_zone(OBJECT_SELF);
  //
  // TRAITEMENTS SPECIFIQUES A LA ZONE
  // .....
}
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.


On_Exit :

NWScript :
#include "eboueur_zones"

void main()
{
  // APPEL DU NETTOYEUR
  exit_eboueur_zone(OBJECT_SELF);
  //
  // TRAITEMENTS SPECIFIQUES A LA ZONE
  // ....
}
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.


enfin la biblio : eboueur_zones

NWScript :
// ****************************** ****
// *  EBOUEUR DE ZONES version 1.1  *
// ****************************** ****
// *  18/02/2005                    *
// *  Conception Patrick Leclercq  *
// ****************************** ****

// DELAI DE NETTOYAGE FIXE A 30 SECONDES
const float DELAI_NETTOYAGE_ZONE = 30.0;


void eboueur_de_zone(object oZone)
{
  // EST-CE L'OPERATION A ETE ANNULEE PAR
  // L'ENTREE D'UN JOUEUR AVANT LE TEMPS LIMITE ?
  if (!GetLocalInt(oZone, "bDemandeEboueur")) return;

  // DESACTIVATION INDICATEUR DE NETTOYAGE
  DeleteLocalInt(oZone, "bDemandeEboueur");

  // LECTURE PREMIER OBJET DE LA ZONE
  object oObjet = GetFirstObjectInArea(oZone);
  // Tant que l'objet est valide
  while(GetIsObjectValid(oObjet))
  {
    int nType = GetObjectType(oObjet);
    switch(nType)
    {
      // EFFACEMENT DE TOUS LES ITEMS SUR LE SOL
      case OBJECT_TYPE_ITEM:
        DestroyObject(oObjet);
      break;
      // EFFACEMENT DE TOUS LES DROPS SUR LE SOL
      case OBJECT_TYPE_PLACEABLE:
        if (GetTag(oObjet)=="BodyBag")
        {
          // LES SACS DE DROP SONT DES OBJETS D'INTRIGUES
          // ET DONC INDESTRUCTIBLES => RETOUR AU STATUT NORMAL
          SetPlotFlag(oObjet, FALSE);
          DestroyObject(oObjet);
        }
      break;
      // EFFACEMENT DE TOUTES LES CREATURES ISSUES DES RENCONTRES
      case OBJECT_TYPE_CREATURE:
        if(GetIsEncounterCreature(oObjet))
          DestroyObject(oObjet);
      break;
    }
    oObjet = GetNextObjectInArea(oZone);
  }
}


// ****************************** ********
// *  SCRIPT A TRAITER QUAND UN JOUEUR  *
// *  SORT D'UNE ZONE                  *
// ****************************** ********
void exit_eboueur_zone(object oZone)
{
  // LECTURE OBJET SORTANT DE LA ZONE
  object oJoueur = GetExitingObject();
  //
  // EST-CE UN JOUEUR ?
  if (!GetIsPC(oJoueur)) return;
  //
  // MISE A JOUR NB DE JOUEURS DANS LA ZONE
  int nNbJoueurs = GetLocalInt(oZone, "nNbJoueursZoneEboueur");
  nNbJoueurs--;
  SetLocalInt(oZone, "nNbJoueursZoneEboueur", nNbJoueurs);
  //
  // ETAIT-CE LE DERNIER JOUEUR DE LA ZONE ?
  if (nNbJoueurs==0)
  {
    // ON ARME L'INDICATEUR DE NETTOYAGE
    SetLocalInt(oZone, "bDemandeEboueur", TRUE);
    // LANCEMENT DE LA DEMANDE DE NETTOYAGE
    // APRES UN DELAI DE QUELQUES MINUTES
    DelayCommand(DELAI_NETTOYAGE_ZONE, eboueur_de_zone(oZone));
  }
}


// ****************************** ********
// *  SCRIPT A TRAITER QUAND UN JOUEUR  *
// *  ENTRE DANS UNE ZONE              *
// ****************************** ********
void enter_eboueur_zone(object oZone)
{
  // LECTURE OBJET ENTRANT DANS LA ZONE
  object oJoueur = GetEnteringObject();
  // EST-CE UN JOUEUR ?
  if (!GetIsPC(oJoueur)) return;
  //
  // MISE A JOUR NB DE JOUEURS DANS LA ZONE
  int nNbJoueurs = GetLocalInt(oZone, "nNbJoueursZoneEboueur");
  nNbJoueurs++;
  SetLocalInt(oZone, "nNbJoueursZoneEboueur", nNbJoueurs);
  //
  // EST-CE QU'UNE DEMANDE DE NETTOYAGE
  // A ETE FAITE PAR UN PJ SORTANT DE LA ZONE ?
  // SI OUI => EFFACEMENT DE LA DEMANDE PAR LE NOUVEL ARRIVANT
  if (GetLocalInt(oZone, "bDemandeEboueur"))
    DeleteLocalInt(oZone, "bDemandeEboueur");
}

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.


avec ce set de script tu devrais plus avoir de souci, a moins que j'ai lu les message précedent en diagonale...Embarassed


EDIT : apres relecture du post, il me semble que tu veux pas detruire les créature estampillées "BOSS", il te suffit d'ajouter un test avant de detruire les créature issue de spawn en vérifiant qu'elle n'ai pas la chaine sting "BOSS" dans son tag. je te l'aurait bien fait mais là il est un peu tard ! Embarassed
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 23/09/2005 00:53:36 Sujet du message :

Non non, ce ne sont pas des "plot items"
remodif pour enlever le "Plot Flag" avant la destruction et aller-retours après avoir détruit 3 scarabés : les "Restes" demeurent en place invariablement.

Image de test 3

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
//Nicetios et Ivellios
//Le 20/09/05

void main()
{
//DECLARATION DES VARIABLES
object oPCexiting=GetExitingObject();
object oAreaLeaved = OBJECT_SELF;
object oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
object oFirstPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
int nNBdePC = GetLocalInt(oAreaLeaved,"nNBdePC"),n=0;

//Mise a jour du Compteur
if (GetIsPC(oPCexiting))
{
nNBdePC = nNBdePC-1;
SetLocalInt(oAreaLeaved,"nNBdePC",nNBdePC);
}

//TEST POUR VERIFIER SI IL RESTE DES PC DANS L'Area

if (nNBdePC == 0)
{
ActionWait(1.1);
 
 

//BOUCLE DE DESTRUCTION DES CREATURES

ActionWait (20.1); //POUR PERMETTRE DESTRUCTION OBJETS LOOTS ON RELANCE LA FONCTION MAIS SUR LES OBJETS ITEMS INVENTAIRE ( decomposition cadavre oblige )
oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
while (GetIsObjectValid(oObjetaDetruire))

{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_PLACEABLE)
)
{
if( GetPlotFlag(oObjetaDetruire) ){
  SendMessageToPC(oPCexiting,"Objet Plot");
  SetPlotFlag(oObjetaDetruire,FALSE);
}
DestroyObject (oObjetaDetruire);
n++ ;
SendMessageToPC(oPCexiting,"Objet detruit :"+IntToString(n)+" "+GetName(oObjetaDetruire)+" "+GetTag(oObjetaDetruire));

}
oObjetaDetruire=GetNextObjectInArea();
}
}

}
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.


Test avec les scripts de Seth de Sombrelune sur la "Hostile Zone" : toujours 3 scarabés et va et vient entre les zones :
Image de test 4

Apparemment, après quelques aller-retour, histoire de dépasser les 30secondes, les "Restes" sont indéracinables.

5°) Les "Restes" ne sont pas des objets plaçables de quête (PLOT FLAG activé).
 
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 52.468ms