JeuxOnLineForumsPlusConnectés : 346 (sites) | 639 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Pour éviter les gardes en Plot... RSS
   
Répondre
Partager Outils Rechercher
Avatar de Elmo
Elmo
Alpha & Oméga
 
Avatar de Elmo
 

Pour éviter les gardes en Plot...

bon je me suis promené sur un module au hasard et je me suis aperçu que touss les gardes étaient en plot, le concepteur jouant en meme temps je lui ai demandé pourquoi, il m'a répondu "le module reboote jamais et est rarement vide, et j'ai pas envie de laisser mon module sans garde"

j'ai ensuite remarqué que ce n'était pas le seul module dans le cas...

j'ai imaginé un système qui à la mort du PNJ, prendrai la location de sa mort et le respawnerai quelques instants plus tard, mais aucun XP ne serait donné à la mort du garde.

Hélas, trois fois hélas, je vois pas trop comment mettre cela en oeuvre
Lien direct vers le message - Vieux
Avatar de Archamedes_Fr
Archamedes_Fr
Alpha & Oméga
 
Avatar de Archamedes_Fr
 
Un truc...

Code PHP:

void VoidCreateObject
(string sTemplatelocation lLocint bUseAppearAnimation=TRUE)
{
    
CreateObject(OBJECT_TYPE_CREATUREsTemplate,lLocbUseAppearAnimation);
}

Void Main()
{
// blablabla
AssignCommandGetAreaOBJECT_SELF ) , DelayCommand2.0VoidCreateObjectOBJECT_SELFGetLocation(OBJECT_SELF)) ) );
// blablabla

ça devrait faire respawn la même créature à l'endroit de sa mort juste après la disparition du cadavre. Pour allonger la durée d'apparition, suffit allonger le delay.

Pour les pex... un GetXP et un SetXP ?
Lien direct vers le message - Vieux
Avatar de Elmo
Elmo
Alpha & Oméga
 
Avatar de Elmo
 
Citation:
18/06/2003 22:08:39 : Erreur. 'respawnmort' n’est pas compilé.
respawnmort.nss(9): ERREUR : DECLARATION DOES NOT MATCH PARAMETERS
Lien direct vers le message - Vieux
Avatar de 'Az
'Az [P.H.]
Alpha & Oméga
 
Avatar de 'Az
 
Code PHP:
void VoidCreateObject(string sTemplatelocation lLocint bUseAppearAnimation=TRUE)
{
    
CreateObject(OBJECT_TYPE_CREATUREsTemplate,lLocbUseAppearAnimation);
}

Void Main()
{
// blablabla
DelayCommand2.0VoidCreateObjectGetResRef(OBJECT_SELF), GetLocation(OBJECT_SELF)) ) ;
// blablabla

Lien direct vers le message - Vieux
Avatar de Ia~
Ia~
Alpha & Oméga
 
Avatar de Ia~
 
Pas de majuscule à "void main()" ...
Code PHP:
void VoidCreateObject(string sTemplatelocation lLocint bUseAppearAnimation=TRUE)
    
CreateObject(OBJECT_TYPE_CREATUREsTemplate,lLocbUseAppearAnimation);

void main()
{
    
object oMe OBJECT_SELF;
    
string sRes GetResRef(oMe);
    
location lLoc GetLocation(oMe);
    
DelayCommand(2.0fVoidCreateObject(sReslLoc)) ;

Edit :

Bon, y'a quand même un truc louche avec ce code. Quand est-ce que OBJECT_SELF disparait ? Et surtout, quand est-ce que GetResRef dans un DelayCommand s'execute-il ? S'il s'execute sur l'instant - ce dont je doute, le script d'Azrael07 fonctionnera. Sinon, le mien devrait marcher, si toutefois OBJECT_SELF est encore valide sur un OnDead.

Re edit :

Nan, pas moyen. La durée de vie de l'objet est d'environ 3 ou 4 secondes en fonction du lag, et il disparait après. Si le DelayCommand est plus long que ça, ca ne marchera pas. J'ai essayé en définissant une variable et en la passant au DelayCommand plutôt que de passer la fonction, ça ne fonctionne pas non plus. J'ai également essayé en définissant un LocalString et une LocalLocation pour les passer au DelayCommand, même résultat.

Je comprend pas trop comment sont gérées ces variables, là...
Lien direct vers le message - Vieux
Avatar de Ia~
Ia~
Alpha & Oméga
 
Avatar de Ia~
 
Voiiiiilà j'ai trouvé !

En fait, DelayCommand n'est rien d'autre qu'un évènement pour l'objet qui l'invoque, pour NWN.

En clair, cela signifie que l'objet qui invoque DelayCommand stock les variables du script en cours - pour qu'elles soient encore valides lors de l'exécution du Delay - et reçoit un event lorsque le temps du Delay est écoulé.

Il exécute alors la commande qui a été Delayée.

Dans notre cas, sur l'évènement OnDead, le DelayCommand est ajouté à la pile de l'objet en train de mourir, objet qui va disparaître dans les 3 secondes ! Fort évidement, ça ne fonctionne pas, l'event est tout simplement supprimé, et rien ne se passe.

La solution de contournement la plus simple serait de créer deux scripts.

Un sur le OnDead :
Code PHP:
void main() {
    
object oPJ GetLastKiller();
    
SetLocalString(oPJ,"RespawnResRef",GetResRef(OBJECT_SELF));
    
SetLocalLocation(oPJ,"RespawnLocation",GetLocation(OBJECT_SELF));
    
ExecuteScript("RespawnAfterKill",oPJ);

Et un script nommé "RespawnAfterKill" :
Code PHP:
void VoidCreateObject(string sTemplatelocation lLocint bUseAppearAnimation=TRUE) {
    
CreateObject(OBJECT_TYPE_CREATUREsTemplate,lLocbUseAppearAnimation);
}

void main() {
    
string sResRef GetLocalString(OBJECT_SELF,"RespawnResRef");
    
location lLoc GetLocalLocation(OBJECT_SELF,"RespawnLocation");
    
DelayCommand(10.0fVoidCreateObject(sResRef,lLoc));
    
DeleteLocalString(OBJECT_SELF,"RespawnResRef");
    
DeleteLocalLocation(OBJECT_SELF,"RespawnLocation");

Et hop, ça marche !

Encore un détail : surtout, ne pas passer directement la fonction GetLocalTruc en argument de VoidCreateObject ! Car du coup, si le PJ tue 2 ennemis à la suite avant le respawn du 1er, il y aura 2 respawns du second... Tandit que si l'on stock les valeurs dans des variables, celles-ci sont mises en pile... Ce n'est pas le cas des fonctions...

Tordu, hein ?

- Edit pour rajouter les DeleteLocal dans le 2ème script -
Lien direct vers le message - Vieux
Avatar de Slay
Slay
Dauphin
 
Avatar de Slay
 
Moi j'ai ça comme solution a ton probleme :

Code PHP:
AssignCommand(GetModule(),DelayCommand(2.0fVoidCreateObject(sReslLoc))) ; 
Tu assigne l'operation à l'objet module qui se charge de respawner le garde un peu plus tard...
( ou on peu aussi utiliser GetArea() au lieu de GetModule() comme dans la version d'Archamedes... )
Bref le truc consiste a confier le respawn a autre chose qu'a l'objet qui est en train de disparaitre, comme tu le fais en utilisant un waypoint... mais en plus simple quand meme
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Pour éviter les gardes en Plot...
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 03h02.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite