Ne pas avoir de double

Répondre
Partager Rechercher
Salut !
J'ai cherché partout mais je ne trouve pas la réponses à mes questions, donc j'en suis reduit à poster un nouveau message

Question 1
Dès que le PJ entre sur le module on lui donne un objet important, si il le jette tant pis pour lui ... mais si quelqu'un d'autre la ramasse ça se corse car personne ne doit l'avoir en double. Je voudrai savoir si il y aurai pas un script pour eviter d'avoir un objet en double (voir triple ou au dela ^^) dans son inventaire mais de garder tout de même un exemplaire.
J'ai penser que mettre le script de verification dans chaque entré de zone, evitons le onheartbeat si possible

Question 2
Ce serai bien si l'objet dont je parle si dessus ne soit pas volable, donc je voudrai savoir si en mettant l'objet en 'objet de quète' ça le rend involable ? (jamais tester et pas l'occazzion donc je demande en passant ) sinon, y a-t-il une autre solution ?

Question 3
Au debut du module je voudrai que le personnage perde tout ses objets si il est niveau 1 (après avoir tout perdu, evidement on lui donne l'objet de la question 1 ^^), j'ai vu un poste la dessus mais y a de la complication avec le fait de mettre les objets perdus dans un contenant ou autre ... juste les detruire pour moi ^^ (si le pj est au lv 1 ...)

Ce sera tout, merci d'avance.
@+
tu peux aussi essayer de mettre un script dans le OnAcquireItem qui verifie si l objet est deja present.

pour ce qui est de retirer tous les objet d un pnj qd il rentre dans le module si il est nivo1, il y beaucoup de module qui le font. il te reste juste a en DL un et de regarder ce qui est fait.
Question 4
Tant qu'on y est ...
J'aimerai que dès que la créature invoqué meurt, l'invocateur de la créature perde des pts de vie (disons qu'il perd la moitier des pts de vie total de la créature et que si ce nombre depasse les pts de vie de l'invocateur, il meurt :P)
Citation :
Provient du message de caarheim
tu peux aussi essayer de mettre un script dans le OnAcquireItem qui verifie si l objet est deja present.

pour ce qui est de retirer tous les objet d un pnj qd il rentre dans le module si il est nivo1, il y beaucoup de module qui le font. il te reste juste a en DL un et de regarder ce qui est fait.
Merci de ta reponse, mais ça m'aide pas plus car il faut en trouver un de module comme ça
Je propose mon truc a moi, a l'entrer du PJ on verifie si celui ci est lvl 1 et s'il l'est on lui donne son objet et on le fait passer lvl 2 comme sa il pourra plus l'avoir mais pour qu'on ne puissent pas le vendre ou méme je jetter c'est un truc qui faut faire dans l'objet (faut selectionner "Objet de quéte" et "objet volé") mais pour pas qu'il puisse se dropper (se jeter) sa je sais pas comment faire.
alors voila le code a mettre dans le OnClientEnter dans les propriétés de ton mod:
Code:
void main()
{
object oPC = GetEnteringObject();

if (GetHitDice(oPC)==1) //on verifie si le PJ est lvl 1 et on le fais passer au lvl 2 comme sa plus de pb

CreateItemOnObject ("Resref de l'item a donner",oPC);

GiveXPToCreature(oPC,1000);

}
Sinon j'ai un autre truc pour toi c'est le faire dans un dialogue.
Explication:
un dialogue:
-Salut tu as l'item? alors voila l'item (E1)
-Non tu as déja l'item (E2)


Alors dans la condition d'execution de (E1) tu mets

Code:
int StartingConditional()
{
object oPC = GetPCSpeaker();

if (GetItemPossessedBy(oPC, "ta gde ton item") == OBJECT_INVALID)

return FALSE;

return TRUE;
}
Et dans l'action conséquence de (E1)

Code:
void main()
{
object oPC= GetLastSpeaker ();
CreateItemOnObject ("resref de ton item", oPC);
}
Donc voila sa devrait aller mais j'ai pas fait avec l'éditeur alors c'est pas sûr que sa marche et si sa marche bin c'est que je commence a connaitre quelques fonctions par coeur
Un bout de mon script OnClientEnter.

Suppression de tout l'équipement, donne un vêtement et équipe le personnage avec, donne de l'or et 1 point d'expérience, au cas où le joueur ferai une Déco-reco avant d'avoir un point d'expérience.

Code PHP:

void main()
{

////////////////////////////////////////////////////////////////////////////////
//  Variables d'identification  ////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
object oPC GetEnteringObject();
string sCDK=GetPCPublicCDKey(oPC);
int nDM=GetIsDM(oPC);

////////////////////////////////////////////////////////////////////////////////
//  variables de suppression de l'équipements  /////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
object oEquip GetFirstItemInInventory(oPC);
object oNewChest;
int nGold 0;
int i 0;
int nNumSlot NUM_INVENTORY_SLOTS;
int nChest INVENTORY_SLOT_CHEST;

////////////////////////////////////////////////////////////////////////////////
//  Gestion de l'équipement lors de l'arrivée sur le serveur  //////////////////
////////////////////////////////////////////////////////////////////////////////
if(GetIsPC(oPC) && !(GetXP(oPC)) && !nDM)
{

    
//Destruction des objets dans l'inventaire
    
while (GetIsObjectValid(oEquip))
    {
        
DestroyObject(oEquip);
        
oEquip GetNextItemInInventory(oPC);
    }
    
//Destruction des objets équipés
    
for(i<= nNumSloti++)
    {
        
object oInv GetItemInSlot(ioPC);
        
DestroyObject(oInv);
    }
    
//Création du vêtement
    
int STARTING_GOLD=0;
    
oNewChest CreateItemOnObject("NW_CLOTH022"oPC);
    
AssignCommand(oPCActionEquipItem(oNewChestnChest));

    if(
GetLevelByClass(CLASS_TYPE_BARBARIANoPC)) STARTING_GOLD=d4(4)*10;
    else if(
GetLevelByClass(CLASS_TYPE_BARDoPC)) STARTING_GOLD=d4(4)*10;
    else if(
GetLevelByClass(CLASS_TYPE_CLERICoPC)) STARTING_GOLD=d4(5)*10;
    else if(
GetLevelByClass(CLASS_TYPE_DRUIDoPC)) STARTING_GOLD=d4(2)*10;
    else if(
GetLevelByClass(CLASS_TYPE_FIGHTERoPC)) STARTING_GOLD=d4(6)*10;
    else if(
GetLevelByClass(CLASS_TYPE_MONKoPC)) STARTING_GOLD=d4(5);
    else if(
GetLevelByClass(CLASS_TYPE_PALADINoPC)) STARTING_GOLD=d4(6)*10;
    else if(
GetLevelByClass(CLASS_TYPE_RANGERoPC)) STARTING_GOLD=d4(6)*10;
    else if(
GetLevelByClass(CLASS_TYPE_ROGUEoPC)) STARTING_GOLD=d4(5)*10;
    else if(
GetLevelByClass(CLASS_TYPE_SORCERERoPC)) STARTING_GOLD=d4(3)*10;
    else if(
GetLevelByClass(CLASS_TYPE_WIZARDoPC)) STARTING_GOLD=d4(3)*10;
    else 
STARTING_GOLD=d4(4)*10;

    
GiveGoldToCreature(oPCSTARTING_GOLD GetGold(oPC));
    
GiveXPToCreature(oPC1);
}

////////////////////////////////////////////////////////////////////////////////
//  OBJETS DIVERS   ////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

if(GetIsObjectValid(GetItemPossessedBy(oPC,"emotewand"))==FALSE)
    
CreateItemOnObject("emotewand"oPC);


Chouette un quizz !

Question 1
Bah tu as plusieurs solutions : il le jette (auquel cas tu peux faire un script simple pour qu'il se détruise 6 minutes après s'il n'a pas réintégré l'inventaire). L'autre solution, plus logique, est de mettre dans ton OnAcquireItem ce script :
Code PHP:

void main()
{
object oItem GetModuleItemAcquired();
string sTagVerif GetTag(oItem);
string sTag "tag_de_ton_item";
if(
sTagVerif == sTag)
 {
 
object oPC GetItemPossessor(oItem);
 
object oItInv GetFirstItemInInventory(oPC);
 while(
GetIsObjectValid(oItInv))
  {
  
string sInv GetTag(oItInv);
  if(
sInv == sTag)
   {
   
DestroyObject(oItInv,0.0);
   }
  
oItInv GetNextItemInInventory(oPC);
  }
 }

A noter que ce script supprimera tous les objets de l'inventaire ayant le même tag que l'objet acquired et gardrera l'acquired... Ca permet d'en supprimer plusieurs si il y en a plusieurs, mais ç peut avoir des conséquences dans certains cas. Si tu préfère simplement supprimer l'objet arrivant si il a son double dans l'inventaire, remplace
Code PHP:

{
 
DestroyObject(oItInv,0.0);

par
Code PHP:

{
 
DestroyObject(oItem,0.0);

Note : les 0.0 ne sont pas obligatoires en théorie, je les utilise par souci protocolaire, tu peux les enlever si tu veux

Question 2
Non. Il sera toujours volable. Tu peux faire un script sur l'objet qui l'empêche d'être volé et avertit le voleur que l'objet qu'il essaye de voler est involable. Je veux bien te le faire, il suffit de demander.

Question 3
Bah pareil, tu met dans le OnEnter du module un script qui vérifie le niveau du perso et lui enlève tous ses objets... (Pas très gentil si le mec se connecte plusieurs fois et qu'il n'a pas gagné de niveau entre temps) ... et son or.
Ca devrait ressembler à ça :
Code PHP:

void main()
{
object oPC GetEnteringObject();
if(
GetIsPC(oPC))
 {
 
int n1 GetLevelByPosition(1,oPC);
 
int n2 GetLevelByPosition(2,oPC);
 
int n3 GetLevelByPosition(3,oPC);
 
int nG n1+n2+n3;
 if(
nG==1)
  {
  
object oIt GetFirstItemInInventory(oPC);
  
int nGold GetGold(oPC);
  
GiveGoldToCreature(oPC,-nGold);
  while(
GetIsObjectValid(oIt))
   {
   
DestroyObject(oIt);
   
oIt GetNextItemInInventory(oPC);
   }
  }
 }

Avec des nuances évidemment Il peut y avoir deux ou trois trucs incertains, mais il y a 75% de chances pour que ça marche.

Question 4
Soit plus précise... En théorie, si c'est une créature invoquée normale, tu dois modifier le fichier de convocation, ou bien utiliser ton OnHeartBeat (je ne te dis pas l'état de ton CPU à la sortie )... Si c 'est un cas spécial (famillier, ou même une créature issue d'un script autre), alors il faut modifier le script correspondant.
Si tu veux un coup de main la dessus, demande moi, c'est déjà plus compliqué.

Voili voilou... Un dernière chose au risque de te faire la morale, essaye de demander un poil plus gentiment la prochaine fois, ça fait toujours plaisir aux personnes qui passent du temps à t'aider et qui ne sont pas obligées

Ange Musicien

PS : après avoir lu les posts d'Archemedes... Regarde ma technique de vérif des classes, elle est plus pratique...
Archamédes, désolé de te décevoir, mais tu n'as pas bien suivi ce qu'elle demande : question 2, objet non droppable ou non vendable n'égale pas objet non volable ... et puis tu utilises la technique du coffre dont elle ne voulait pas entendre parler... Ah là là... C'est pas parce qu'il demande pas gentiment qu'il faut essayer de l'embrouiller

Edit // Autre chose : quand tu fais "takegold", en théorie c'est un perso qui l'exécute... Donc tu es sensé mettre :
GiveGold...(oPC,-nombreaenlever);
C'est tout...
Gniiii ?

Mon script concerne pas les coffres
Il vide l'inventaire à un personnage qui n'a aucun point d'expérience.

Parmi les deux scripts que je propose du vault, un des deux gère les objets uniques, non vendables, non droppable et non volables. Ok, j'aurais pu préciser.
Me semble que TakeGold est utilisé uniquement par des créatures... A la fin ou au cours d'une conversation par exemple. Très pratique... M'enfin ce n'est rien d'autre que 2Give+un message server... Plus personne me suit ? Tant pis.
Ok, sauf qu'il me semble que GiveGoldToCreature négatif ne fonctionne pas

Code PHP:

GiveGoldToCreature(oPCSTARTING_GOLD GetGold(oPC)); 

devrait dans le cas du moine lui baisser son montant de départ.

Le moine démarre à 20 pOr, je lui donne 5d4, et il commence toujours à 20

Yapluka décortiquer GiveGold pour comprendre pourquoi elle bloque à 0.
Je comprends pas... Tu donnes à ton moine qui commence à 20 PO, 5d4 PO.il devrait arriver entre 25 et 40. Puis tu lui enlèves les GetGold, et ça doit être là que ça coince, tu fais beaucoup d'opération en même temps. Finalement, si ça se trouve tu t'es contenté de lui enlevé 5d4, c'est à dire 5-20, les mêmes. On va procéder autrement.

Déjà isole.
fait :
int nGoldPC = GetGold(oPC);
int nGoldPCNeg = -nGoldPC;
int nGold = STARTING_GOLD + nGoldPCNeg;
GiveGoldToCreature(oPC, nGold);

Ca devrait être mieux. Si ça ne marche toujours pas, refait les étapes une par une. Et pis l'erreur ne vient pas forcément de là... Quand au give, je l'ai utilisé des tas de fois en négatif, et il marche très bien.
Vi TakeGoldFromCreature ne fonctionne que si c'est une créature qui l'exécute. Mais on peut aussi l'exécuter directement en faisant un

Code PHP:

AssignCommand(oPCTakeGoldFromCreature(GetGold(oPC), oPCTRUE)); 

Attention si on veut donner une certaine somme d'or par derrière il faut mettre un petit DelayCommand (1.0 suffit) avec le GiveGoldToCreature sinon la somme en question partira en fumée avec l'or de départ viré par le TakeGoldFromCreature.
Merci pour vos nombreuses réponses mais j'ai toujours des soucis

Pour avoir mon personnage nu dès le départ j'ai utilisé le script d'Archamedes_Fr, marche très bien )
Donc mon problème avec la question 3 est résolu

Par contre là où sa coince beaucoup, c'est avec le script d'Ange Musicien pour la Question 1 (perdre l'objet si on le récupère en double). Car dès le départ, avec le script d'Archamedes_Fr on obtient justement cette objet, mais comme on l'obtiens on le reperd de suite +_+
J'ai aussi essayer de poser cette objet par terre et de le ramasser mais on le perd toujours ... en fait ce qu'il faudrai c'est que le script vérifie si on l'a en plusieurs exemplaire et en laisse 1, ou alors, dès qu'on récupère cette objet, il détruit tous les objets du même tag dans l'inventaire et une fois ceci fait il en redonne 1.

Citation :
Question 4
Soit plus précise... En théorie, si c'est une créature invoquée normale, tu dois modifier le fichier de convocation, ou bien utiliser ton OnHeartBeat (je ne te dis pas l'état de ton CPU à la sortie )... Si c 'est un cas spécial (famillier, ou même une créature issue d'un script autre), alors il faut modifier le script correspondant.
Si tu veux un coup de main la dessus, demande moi, c'est déjà plus compliqué.
C'est une créature invoqué normal, je pense qu'il vaut mieux modifier le fichier de convocation (je sais même pas lequel c'est ).

Voila, merci beaucoup pour vos réponses, j'espère qu'il y en aurai d'autre

Citation :
Voili voilou... Un dernière chose au risque de te faire la morale, essaye de demander un poil plus gentiment la prochaine fois, ça fait toujours plaisir aux personnes qui passent du temps à t'aider et qui ne sont pas obligées
Pourtant j'ai été poli, j'ai dit Salut, @+ j'ai tenté d'être clair et j'ai même utilisé des smileys souriant De plus je respect votre travail car vous aidez vraiment.

PS : Ah oui, je suis un homme
Code PHP:

void main()
{
    
object oItem GetModuleItemAcquired();
    
string sTag "tag_de_ton_item";
    
    if( 
GetTagoItem ) == sTag )
    {
        
object oPC GetItemPossessoroItem );
        
object oItInv GetFirstItemInInventoryoPC );
        
int nCnt 0;
     
        while( 
GetIsObjectValidoItInv ) )
        {
            if( 
GetTagoItInv ) == sTag )
            {
                
nCnt++;
                
                if( 
nCnt DestroyObjectoItInv );
            }
            
oItInv GetNextItemInInventoryoPC );
        }
    }

de memoire (je n'ai pas acces a nwn, la), le OnDeath des creature invoquées est le fichier nw_ch_ace.nss, je crois.


Ceci etant, c'est assez simple de retourver : tu ouvre le fichier .bif avec le nwn viewer, et tu recherche les familiers ou les invocations dans le fichier template, et tyu aura tout pleins d'info, dont els scripts utilisés par chacunes.
Je pense avoir trouvé mais j'ai un doute après test :/
nw_ch_ace.nss c'est quelque chose pour des portes apparemment. Mais il y a nw_ch_ac7.nss qui concerne la mort, mais le mort des familier et des henchman, je ne sais pas si ils font la différence entre henchman et créatures invoqué, j'ai fait un petit test car j'ai vu le script qui donne des dégâts au PJ lors de la mort d'un familier et je l'ai mis aussi pour le henchman mais aucun effet.
Donc soit c'est pas le bon script, soit je me suis planté

Si ça peut aider voici le contenu du fichier nw_ch_ac7.nss
Code PHP:

//::///////////////////////////////////////////////
//:: Henchman Death Script
//::
//:: NW_CH_AC7.nss
//::
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
//:: <description>
//:://////////////////////////////////////////////
//::
//:: Created By:
//:: Modified by:   Brent, April 3 2002
//::                Removed delay in respawning
//::                the henchman - caused bugs
//:://////////////////////////////////////////////

//::///////////////////////////////////////////////
//:: Greater Restoration
//:: NW_S0_GrRestore.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Removes all negative effects of a temporary nature
    and all permanent effects of a supernatural nature
    from the character. Does not remove the effects
    relating to Mind-Affecting spells or movement alteration.
    Heals target for 5d8 + 1 point per caster level.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Jan 7, 2002
//:://////////////////////////////////////////////
//:: VFX Pass By: Preston W, On: June 20, 2001
#include "nw_i0_generic"
#include "nw_i0_plot"

/*
// * June 1: use RemoveEffects from plot include instead
void GreaterRestore(object oHench)
{
    //Declare major variables
    object oTarget = oHench;
    effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION_GREATER);

    effect eBad = GetFirstEffect(oTarget);
    //Search for negative effects
    while(GetIsEffectValid(eBad))
    {
        if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
            GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
            GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
            GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
            GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
            GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
            GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
            GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
            GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
            GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
            GetEffectType(eBad) == EFFECT_TYPE_CURSE ||
            GetEffectType(eBad) == EFFECT_TYPE_DISEASE ||
            GetEffectType(eBad) == EFFECT_TYPE_POISON ||
            GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
            GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
        {
            //Remove effect if it is negative.
            RemoveEffect(oTarget, eBad);
        }
        eBad = GetNextEffect(oTarget);
    }
   // ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oTarget);
}     */


void BringBack()
{
    
SetLocalObject(OBJECT_SELF,"NW_L_FORMERMASTER"GetMaster());
    
// : REMINDER: The delay is here   for a reason
    
DelayCommand(0.1RemoveEffects(OBJECT_SELF));
    
DelayCommand(0.2ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectResurrection(), OBJECT_SELF));
    
DelayCommand(0.3ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectHeal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF));
    
DelayCommand(5.1SetIsDestroyable(TRUETRUETRUE));
    
object oWay GetObjectByTag("NW_DEATH_TEMPLE");
    if (
GetIsObjectValid(oWay) == TRUE)
    {
        
// * if in Source stone area, respawn at opening to area
        
if (GetTag(GetArea(OBJECT_SELF)) == "M4Q1D2")
        {
            
DelayCommand(0.2JumpToObject(GetObjectByTag("M4QD07_ENTER"), FALSE));
        }
        else
            
DelayCommand(0.2JumpToObject(oWayFALSE));
    }
    else
        
DelayCommand(0.3ActionSpeakString("UT: No place to go"));


}
void main()
{
    
// * This is used by the advanced henchmen
    // * Let Brent know if it interferes with animal
    // * companions et cetera
    
if (GetIsObjectValid(GetMaster()) == TRUE)
    {
        
object oMe GetAssociate(ASSOCIATE_TYPE_HENCHMANGetMaster());
        if (
oMe == OBJECT_SELF
            
// * this is to prevent 'double hits' from stopping
            // * the henchmen from moving to the temple of tyr
            // * I.e., henchmen dies 'twice', once after leaving  your party
            
|| GetLocalInt(OBJECT_SELF"NW_L_HEN_I_DIED") == TRUE)
        {
           
SetPlotFlag(oMeTRUE);
           
SetAssociateState(NW_ASC_IS_BUSYTRUE);
           
AddJournalQuestEntry("Henchman"99GetMaster(), FALSEFALSEFALSE);
           
SetIsDestroyable(FALSETRUETRUE);
           
SetLocalInt(OBJECT_SELF"NW_L_HEN_I_DIED"TRUE);
       
//     RemoveHenchman(GetMaster());
           // effect eRaise = EffectResurrection();
            
ClearAllActions();
            
DelayCommand(0.5ActionDoCommand(SetCommandable(TRUE)));
            
DelayCommand(5.0ActionDoCommand(SetAssociateState(NW_ASC_IS_BUSYFALSE)));

            
DelayCommand(5.0SetPlotFlag(oMeFALSE));

            
BringBack();
            
SetCommandable(FALSE);


        }
        else
        
// * I am a familiar, give 1d6 damage to my master
        
if (GetAssociate(ASSOCIATE_TYPE_FAMILIARGetMaster()) == OBJECT_SELF)
        {
            
// April 2002: Made it so that familiar death can never kill the player
            // only wound them.
            
int nDam =d6();
            if (
nDam >= GetCurrentHitPoints(GetMaster()))
            {
                
nDam GetCurrentHitPoints(GetMaster()) - 1;
            }
            
effect eDam EffectDamage(nDam);
            
FloatingTextStrRefOnCreature(63489GetMaster(), FALSE);
            
ApplyEffectToObject(DURATION_TYPE_PERMANENTeDamGetMaster());
        }
    }

Répondre

Connectés sur ce fil

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