Pour éviter les gardes en Plot...

Répondre
Partager Rechercher
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
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 ?
Citation :
18/06/2003 22:08:39 : Erreur. 'respawnmort' n’est pas compilé.
respawnmort.nss(9): ERREUR : DECLARATION DOES NOT MATCH PARAMETERS
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

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à...
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 -
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
Répondre

Connectés sur ce fil

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