La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 10:08:17
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Aldigo Chevalier Messages: 70 |
Bonjour,
Le sujet concernant le script de sommation de déposer les armes a déjà était posté, mais à chaque fois le script proposé faisait intervenir l'événement OnHearbeat ( ce que je souhaite éviter ) j'ai donc opté pour la solution qui fait intervenir OnPerception : mais à vrai dire le résultat est plutôt décevant. Très souvent en me pointant avec une arme sous le nez du garde, celui-ci ne bouge pas d'un poil! Je voudrais savoir s'il y avait un moyen d'optimiser le OnPerception du garde pour remèdier à ce problème ? Merci pour votre aide. |
Revenir en haut | |
Stan Grand Chevalier Messages: 126 |
Le soucis du on perception, il se déclenche pas si souvent que le onheartbeat, en fait une fois que t'es detecté il se déclenche plus, ou alors longtemps après.Du coup si tu te ramenes devant ton garde sans arme, qu'ensuite tu sors une arme, il va probablement pas réagir.
Enfin, je dis peut-être des bétises mais j'ai ce genre de problème avec un autre PNJ et un script dans onperception. |
Revenir en haut | |
Aldigo Chevalier Messages: 70 |
Tout bien réfléchit, le nombre de gardes n'étant pas trop élevé, je vais opter pour le OnHeartbeat (c'est plus réaliste). En revanche je souhaite faire mon propre script, ce que j'ai fait
Mais j'ai maintenant plusieurs problèmes : 1) Le garde stop sa ronde toujours au même endroit et s'équipe d'une torche. 2) La perception (et donc la sommation de déposer les armes ne marche pas du tout. Si vous pourriez m'indiquer où sa cloche, parce que là je vois pas ! Voici le script que j'utilise (mince les "&" sont remplacés par des "&" ): NWScript : #include "NW_I0_GENERIC" void main() { string S1=""; string S2=""; string sTag; float WARN_DISTANCE = 30.0; object oPC; object oHench = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC); object oItem1 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); object oItem2 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC); object oItem3 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oHench); object oItem4 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oHench); object oTorch; if(GetIsNight() && GetItemInSlot(INVENTORY_SLOT_LEFTHAND, OBJECT_SELF) == OBJECT_INVALID) { oTorch = GetFirstItemInInventory(OBJECT_SELF); while (GetIsObjectValid(oTorch)) { sTag = GetTag(oTorch); if(sTag == "NW_IT_TORCH001") { DelayCommand(2.0, ClearAllActions()); DelayCommand(2.1, ActionDoCommand(ActionEquipItem(oTorch, INVENTORY_SLOT_LEFTHAND))); } oTorch = GetNextItemInInventory(OBJECT_SELF); } return; } if((GetIsDay() || GetIsDawn()) && GetItemInSlot(INVENTORY_SLOT_LEFTHAND, OBJECT_SELF) != OBJECT_INVALID) { oTorch = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, OBJECT_SELF); sTag = GetTag(oTorch); if(sTag == "NW_IT_TORCH001") { DelayCommand(2.0, ClearAllActions()); DelayCommand(2.1, ActionDoCommand(ActionUnequipItem(oTorch))); } } if (GetIsNight() || GetIsDusk()) { object oFleefrom = GetNearestObject(OBJECT_TYPE_CREATURE, OBJECT_SELF,1); int iEnemy=0; if(GetIsReactionTypeHostile(oFleefrom, OBJECT_SELF)) { iEnemy=1; } int nHour = GetTimeHour(); if (iEnemy==0 && nHour==20 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"vingt"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",20); } if (iEnemy==0 && nHour==21 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"vingt-et-une"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",21); } if (iEnemy==0 && nHour==22 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"vingt-deux"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",22); } if (iEnemy==0 && nHour==23 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"vingt-trois"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",23); } if (iEnemy==0 && nHour==0 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString("")); SetLocalInt(OBJECT_SELF,"Called_Time",0); } if (iEnemy==0 && nHour==1 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"une"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",1); } if (iEnemy==0 && nHour==2 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"deux"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",2); } if (iEnemy==0 && nHour==3 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"trois"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",3); } if (iEnemy==0 && nHour==4 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"quatre"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",4); } if (iEnemy==0 && nHour==5 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString("")); DelayCommand(5.0,SpeakString("")); SetLocalInt(OBJECT_SELF,"Called_Time",5); } } if(GetLocalInt(GetModule(), "WeaponAllowed") == TRUE) { return; } oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF); object oFleefrom = GetNearestObject(OBJECT_TYPE_CREATURE, OBJECT_SELF,1); if(GetIsReactionTypeHostile(oFleefrom, OBJECT_SELF)) { ActionMoveAwayFromObject(oFleefrom, TRUE, 40.0f); DelayCommand(1.0,SpeakString("Des renforts! Des renforts! Y'a du grabuge! Des renforts!")); } if(oPC != OBJECT_INVALID && (GetDistanceBetween(OBJECT_SELF,oPC) < WARN_DISTANCE) && GetObjectSeen(oPC) && !GetIsEnemy(oPC)) { if((oItem1 !=OBJECT_INVALID) || (oItem2 !=OBJECT_INVALID )) { SetLocalInt(OBJECT_SELF, "WeaponOut", TRUE); } if((oItem3 !=OBJECT_INVALID) || (oItem4 !=OBJECT_INVALID )) { SetLocalInt(OBJECT_SELF, "HenchWeaponOut", TRUE); } if(GetLocalInt(OBJECT_SELF, "WeaponOut") == TRUE || GetLocalInt(OBJECT_SELF, "HenchWeaponOut") == TRUE) { AssignCommand(oPC, ClearAllActions()); ClearAllActions(); ActionMoveToObject(oPC, TRUE); ActionStartConversation(oPC); } } } |
Revenir en haut | |
Stan Grand Chevalier Messages: 126 |
Je suis loin d'être un pro mais je crois que l'erreur est dans les déclarations.
NWScript :
object oPC; object oItem1 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); object oItem2 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC); object oItem3 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oHench); object oItem4 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oHench); Tu déclares comme ça, donc pour moi tes oItems ne fonctionnent pas.Car il doit dire : je prend l'objet dans la main gauche d'une creature non définie, donc y'a rien. Ensuite quand tu apelles dans le script tes oItems, il ne relance pas le GetItemIsSlot, il se contente d'utiliser ce qui est défini, donc aucun objet (ou un objet invalid je sais pas comment il considère ce que tu as déclaré). Hormis ça : Un truc d'optimisation, je trouve que ça manque de Else. Quand tu fais un test et qu'il échoue, j'aurai mis des elses pour réduire les instruction à effectuer. Genre If ( il est tel heure) faire ceci Else If (il est tel heure) Ca évite qu'il test toutes tes conditions suivantes s'il tombe sur la bonne du premier coup et dieu sait que les scripts sur les onheartbeat ont interêt d'être soigné sinon tes ressources morflent. |
Revenir en haut | |
Aldigo Chevalier Messages: 70 |
Merci pour ces précisions.
Citation : Car il doit dire : je prend l'objet dans la main gauche d'une creature non définie, donc y'a rien. Quel idiot je suis ! J'ai oublié de déclarer la valeur de oPC
Bien entendu ici c'est : NWScript :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.
Citation : Quand tu fais un test et qu'il échoue, j'aurai mis des elses pour réduire les instruction à effectuer. C'est maintenant corrigé! |
Revenir en haut | |
Stan Grand Chevalier Messages: 126 |
Bon, est ce que ça t'a résolu le probleme des joueurs armés ?
Sinon nulle part tu redis à ton garde de reprendre sa ronde après les actions, donc avec un ClearAllActions() il vide tout ce qu'il faisait, il sort sa torche, et reste planté là, non ? |
Revenir en haut | |
Aldigo Chevalier Messages: 70 |
Citation : Bon, est ce que ça t'a résolu le probleme des joueurs armés ? Oui c'est fait.
Citation : Sinon nulle part tu redis à ton garde de reprendre sa ronde après les actions, donc avec un ClearAllActions() il vide tout ce qu'il faisait, il sort sa torche, et reste planté là, non ? J'ai modifié le script OnSpawn du garde ce qui lui permet de reprendre sa ronde.
Au final j'ai un script qui marche bien Mais j'ai une autre question : sachant que le garde porte un bouclier exclusivement le jour et une torche la nuit, si le garde passe en attaque la nuit (il est attaqué par le joueur où il se défend contre des créatures hostiles) comment l'intégré dans mon script pour qu'il prenne son bouclier pendant le combat et le range après son combat et s'équipe de nouveau avec la torche ? ( je sais ça fait beaucoup de questions , mais je débute alors...). Si ça t'intéresse voici mon script : NWScript : //OnUserDefined void main() { string S1=""; string S2=""; string sTag; float WARN_DISTANCE = 20.0; // Distance de perception du garde object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF); object oFleefrom = GetNearestObject(OBJECT_TYPE_CREATURE, OBJECT_SELF,1); object oHench = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC); object oItem1 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); object oItem2 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC); object oItem3 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oHench); object oItem4 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oHench); object oTorch; int nItem1 = GetBaseItemType(oItem1); int nItem2 = GetBaseItemType(oItem2); int nItem3 = GetBaseItemType(oItem3); int nItem4 = GetBaseItemType(oItem4); int nUser = GetUserDefinedEventNumber(); int nHour = GetTimeHour(); if(nUser == 1001) //HEARTBEAT { // De nuit le garde porte une torche if(GetIsNight() && (GetItemInSlot(INVENTORY_SLOT_LEFTHAND, OBJECT_SELF) == OBJECT_INVALID || GetTag(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC)) == "NW_ASHSW001") && !GetIsInCombat()) { oTorch = GetFirstItemInInventory(OBJECT_SELF); while (GetIsObjectValid(oTorch)) { sTag = GetTag(oTorch); if(sTag == "NW_IT_TORCH001") { DelayCommand(0.9, ClearAllActions()); DelayCommand(2.1, ActionDoCommand(ActionEquipItem(oTorch, INVENTORY_SLOT_LEFTHAND))); } oTorch = GetNextItemInInventory(OBJECT_SELF); } return; } // De jour le garde ne porte plus la torche if((GetIsDay() || GetIsDawn()) && GetItemInSlot(INVENTORY_SLOT_LEFTHAND, OBJECT_SELF) != OBJECT_INVALID) { oTorch = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, OBJECT_SELF); sTag = GetTag(oTorch); if(sTag == "NW_IT_TORCH001") { DelayCommand(2.0, ClearAllActions()); DelayCommand(2.1, ActionDoCommand(ActionUnequipItem(oTorch))); DelayCommand(4.0,ActionDoCommand(ActionEquipItem(oShield, INVENTORY_SLOT_LEFTHAND))); } } if (GetIsNight() || GetIsDusk()) { int iEnemy=0; if(GetIsReactionTypeHostile(oFleefrom, OBJECT_SELF)) { iEnemy=1; } if(GetLocalInt(GetModule(), "WeaponAllowed") == TRUE) { return; } if(oPC != OBJECT_INVALID && (GetDistanceBetween(OBJECT_SELF,oPC) < WARN_DISTANCE) && GetObjectSeen(oPC) && !GetIsEnemy(oPC)) { if((nItem2 != 256) && (nItem1 != 256 || nItem1 != 14 || nItem1 != 15 || nItem1 != 56 || nItem1 != 57)) { SetLocalInt(OBJECT_SELF, "WeaponOut", TRUE); } if((nItem4 != 256) && (nItem3 != 256 || nItem3 != 14 || nItem3 != 15 || nItem3 != 56 || nItem3 != 57)) { SetLocalInt(OBJECT_SELF, "HenchWeaponOut", TRUE); } if(GetLocalInt(OBJECT_SELF, "WeaponOut") == TRUE || GetLocalInt(OBJECT_SELF, "HenchWeaponOut") == TRUE) { SetLocalInt(OBJECT_SELF,"WeaponOut",FALSE); SetLocalInt(OBJECT_SELF,"HenchWeaponOut",FALSE); AssignCommand(oPC, ClearAllActions()); ClearAllActions(); ActionMoveToObject(oPC, TRUE); ActionStartConversation(oPC); } } if (iEnemy==0 && nHour==20 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"vingt"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",20); } else if (iEnemy==0 && nHour==21 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"vingt-et-une"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",21); } else if (iEnemy==0 && nHour==22 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"vingt-deux"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",22); } else if (iEnemy==0 && nHour==23 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"vingt-trois"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",23); } else if (iEnemy==0 && nHour==0 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString("")); SetLocalInt(OBJECT_SELF,"Called_Time",0); } else if (iEnemy==0 && nHour==1 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"une"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",1); } else if (iEnemy==0 && nHour==2 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"deux"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",2); } else if (iEnemy==0 && nHour==3 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"trois"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",3); } else if (iEnemy==0 && nHour==4 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString(S1+"quatre"+S2)); SetLocalInt(OBJECT_SELF,"Called_Time",4); } else if (iEnemy==0 && nHour==5 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour) { DelayCommand(0.2,SpeakString("")); DelayCommand(2.5,SpeakString("")); SetLocalInt(OBJECT_SELF,"Called_Time",5); } } if(GetIsDay() || GetIsDawn()) { if(GetLocalInt(GetModule(), "WeaponAllowed") == TRUE) { return; } if(oPC != OBJECT_INVALID && (GetDistanceBetween(OBJECT_SELF,oPC) < WARN_DISTANCE) && GetObjectSeen(oPC) && !GetIsEnemy(oPC)) { if((nItem2 != 256) && (nItem1 != 256 || nItem1 != 14 || nItem1 != 15 || nItem1 != 56 || nItem1 != 57)) { SetLocalInt(OBJECT_SELF, "WeaponOut", TRUE); } if((nItem4 != 256) && (nItem3 != 256 || nItem3 != 14 || nItem3 != 15 || nItem3 != 56 || nItem3 != 57)) { SetLocalInt(OBJECT_SELF, "HenchWeaponOut", TRUE); } if(GetLocalInt(OBJECT_SELF, "WeaponOut") == TRUE || GetLocalInt(OBJECT_SELF, "HenchWeaponOut") == TRUE) { SetLocalInt(OBJECT_SELF,"WeaponOut",FALSE); SetLocalInt(OBJECT_SELF,"HenchWeaponOut",FALSE); AssignCommand(oPC, ClearAllActions()); ClearAllActions(); ActionMoveToObject(oPC, TRUE); ActionStartConversation(oPC); } } } } else if(nUser == 1002) // PERCEIVE { if(GetIsReactionTypeHostile(oFleefrom, OBJECT_SELF)) { ActionMoveAwayFromObject(oFleefrom, TRUE, 40.0f); DelayCommand(1.0,SpeakString("Des renforts! Des renforts! Y'a du grabuge! Des renforts!")); } } } |
Revenir en haut | |
Laxam Légende vivante Messages: 425 Localisation: Lyon |
Il n'y a pas un évenement qui dit que le NPC est en cours de combat Il me semble que si, alors dans ce cas, quand il commence à combattre tu mets un truc du genre EquipItem et quand ça cesse, un truc du genre UnEquipItem.... c'est juste une piste comme ça...
_________________ Mon site NWN nouvelle version et mon module Boisperdu en ligne ! Et maintenant un FORUM La première version française de la doc du NPC Activities (version 2.0) |
Revenir en haut | |
Stan Grand Chevalier Messages: 126 |
NWScript :
if (GetIsNight() || GetIsDusk()) { int iEnemy=0; if(GetIsReactionTypeHostile(oFleefrom, OBJECT_SELF)) { iEnemy=1; }} Tu peux l'ajouter ici, quand il se rend compte qu'il y a des ennemis, il sort son bouclier pour se proteger au cas où. NWScript :
object oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND, OBJECT_SELF); if ((GetIsObjectValid(oItem)&& GetTag(oItem)!="tagbouclier")||(!GetIsObjectValid(oItem))) //s'il porte quelque chose main gauche et que ce n'est pas le bouclier, ou s'il ne porte rien { ActionUnequipItem(oItem, INVENTORY_SLOT_LEFTHAND); //on cherche le bouclier oItem = GetFirstItemInInventory(OBJECT_SELF); while (GetIsObjectValid(oItem)&&(GetTag(oItem)!="tagdubouclier")) { oItem = GetNextItemInInventory(OBJECT_SELF); } if (GetTag(oItem)=="Tagdubouclier") ActionEquipItem(oItem, INVENTORY_SLOT_LEFTHAND); } Voilà c'est probablement pas exactement le script qui fonctionnera ni que tu utiliseras mais ça retranscrit l'idée générale. Je n'ai pas mis de ClearAllActions() car je crois que s'équiper ou se déséquiper sur la main gauche est permit en combat et se fait automatiquement sans gener le combat. Si ça marche pas tu peux toujours leur faire porter des hallebardes comme de vrais gardes |
Revenir en haut | |
Aldigo Chevalier Messages: 70 |
J'ai suivi ta piste et celle de Laxam : j'utilise l'évènement OnEndCombatRound pour permettre au garde de se rééquiper de la torche. Le résultat est très satisfaisant
Ca marche donc pour des gardes ayant une arme à une main ou deux mains (mais dans ce cas le bouclier ne sert à rien ) Encore merci pour vos conseils! |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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