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 01/11/2024 21:29:37
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 |
darkheaven Acolyte Messages: 35 Localisation: nevers |
Bonjour a tous qui liront ce sujet,
Apres quelques recherche sur le forum je me suis dit que j'allais poster pour ne pas upper un sujet trop vieu. Je suis a la recherche d'un script qui a pour effet de mettre en evidence dans les logs l'action de voler. Travaillant sur un serveur ou le vol est tres peu tolerer, cela pourrait etre pratique pour decouvrir les coupables. J'ai trouver ceci : NWScript :
void main() { object oVole = GetModuleItemAcquiredFrom(); object oVoleur = GetModuleItemAcquiredBy(); object oItem = GetModuleItemAcquired(); if ( GetModuleItemAcquiredFrom() != OBJECT_INVALID ) { PrintString( GetName( oItem ) + "" + ( GetName( oVole ) ) + "" + ( GetName( oVoleur ) )); } } Le probleme avec ce script c'est qu'il marque dans les log TOUTES les actions de transfert d'item pnj/pj pj/pj contenant/pj mais PAS les vols alors que c'etait a la base son role premier. Il me semble qu'il existe deja un script qui a cette fonction d'ou ma question, si quelqu'un l'avait quelques part pourrait il me le donner? ou dans le cas contraire aider a la modification de celui ci pour que le probleme soit regler? merci d'avance _________________ La vie n'est qu'une plume que le destin balade au grés du vent... |
Revenir en haut | |
AZAZEL11 Seigneur Messages: 156 |
tiens, je crois qu'en regardant ce script ca va t'aider:
NWScript :
void main() { object oItemAcquired = GetModuleItemAcquired(); string sItemName = GetName(oItemAcquired); string sNumStackedItems = IntToString(GetNumStackedItems(oItemAcquired)); object oItemPossessor = GetItemPossessor(oItemAcquired); string sPossessorName = GetName(oItemPossessor); string sPossessorLvl = IntToString(GetHitDice(oItemPossessor)); object oItemOldPossessor = GetModuleItemAcquiredFrom(); string sOldPossessorName = GetName(oItemOldPossessor); string sOldPossessorLvl = IntToString(GetHitDice(oItemOldPossessor)); string sSaid = sItemName + " (" + sNumStackedItems + "" + sOldPossessorName + " (Niveau : " + sOldPossessorLvl + "" + sPossessorName + " (Niveau : " + sPossessorLvl + ")."; if(GetIsObjectValid(oItemOldPossessor) && GetIsPC(oItemOldPossessor) && GetIsPC(oItemPossessor) && GetStolenFlag(oItemAcquired)==TRUE) { SendMessageToAllDMs("[VOL] " + sSaid); } } Une idée comme ca, tu pourrais essayer d'utiliser cette commande GetIsSkillSuccessful(ACTION_PICKPOCKET); _________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
Revenir en haut | |
lylver Héros Messages: 274 |
J'ai fait ca pour un projet NWN-CFR mais nous avons peu l'occasion de tester en fait : je suis demandeur de retour de test pour savoir si cela marche bien (bah vi nos joueurs sont paisibles...)
NWScript :
//:: //// //:: Updated Lylver 2005-09-16 //:: pour le TN Bouchon 2 //:: tn_mod_def_unaq //:: conservation/adaptation code ATS //:: Put into: OnItemUnAcquire Event void main() { // Use this in an OnItemLost script to get the item that was lost/dropped. // * Returns OBJECT_INVALID if the module is not valid. object oItem = GetModuleItemLost(); string sItemTag = GetTag(oItem); object oItemLost = GetModuleItemLost() ; if( GetStolenFlag(oItemLost) ){ object oVictim = GetModuleItemLostBy() ; // ou GetModuleItemAcquiredFrom() object oThief = GetItemPossessor(oItemLost) ; // GetModuleItemAcquiredBy() n'est pas recalcule sur le OnItemUnAcquire, il reste a son // ancienne valeur ! // merci au createur du script du tonneau alchimique (x2_it_pkeg) pour l'indication // "Check to see if the current item possessor is valid " // "- if so - assume it was given to a henchman so don't make the placeable " // "if (GetIsObjectValid(GetItemPosse ssor(oItem)) == FALSE) " SetLocalObject(oVictim,"THIEF",oThief); SetLocalObject(oVictim,"ITEM",oItemLost); SetLocalInt(oVictim,"ITSTACKSIZE",GetModuleItemAcquiredStackSize()); if( GetIsPC(oVictim) || GetIsPC(oThief) ) ExecuteScript("ly_theft",oVictim) ; } } NWScript : //:: //// //:: ly_theft.nss //:: Created Lylver 2005-01-08 //:: //// // Return Item inventory width // Uses Get2DAString int GetInvSlotWidth(object oItem) { int nBaseType = GetBaseItemType(oItem); return StringToInt(Get2DAString("baseitems","InvSlotWidth",nBaseType)) ; } int GetInvSlotHeigth(object oItem) { int nBaseType = GetBaseItemType(oItem); return StringToInt(Get2DAString("baseitems","InvSlotHeight",nBaseType)) ; } int GetWeaponSize(object oItem) { int nBaseType = GetBaseItemType(oItem); return StringToInt(Get2DAString("baseitems","WeaponSize",nBaseType)) ; } int GetItemWeight(object oItem) { int nBaseType = GetBaseItemType(oItem); return StringToInt(Get2DAString("baseitems","TenthLBS",nBaseType)) ; } void main(){ object oVictim = OBJECT_SELF ; object oThief = GetLocalObject(oVictim,"THIEF") ; DeleteLocalObject(oVictim,"THIEF"); object oItem = GetLocalObject(oVictim,"ITEM") ; DeleteLocalObject(oVictim,"ITEM"); int nItStackSize = GetLocalInt(oVictim,"ITSTACKSIZE") ; DeleteLocalInt(oVictim,"ITSTACKSIZE"); int nHeight = GetInvSlotHeigth(oItem) ; int nWidth = GetInvSlotWidth(oItem) ; int nWeight = GetItemWeight(oItem) ; int nSize = GetWeaponSize(oItem) ; SendMessageToPC(oThief,"Entree dans ly_theft.nss"); string sInfo = " Debug :\n"+"Largeur de l'objet : "+IntToString(nWidth)+ " Hauteur de l'objet : "+IntToString(nHeight)+ " Taille de l'objet : "+IntToString(nSize)+ " Poids de l'objet (TenLBS): "+IntToString(nWeight)+ " Victime : "+GetName(oVictim)+ " Voleur : "+GetName(oThief)+ " Objet : "+GetName(oItem) ; // vol ? if( GetLastDisturbed() == oThief ){ // bah oui... SendMessageToPC(oThief,"Reconnu comme ayant modifie l'inventaire de "+GetName(oVictim)); } if( GetInventoryDisturbItem() == oItem ){ SendMessageToPC(oThief,"Objet modifie reconnu"); // meme item } if( GetInventoryDisturbType() == INVENTORY_DISTURB_TYPE_STOLEN ){ SendMessageToPC(oThief,"Dernier evenement inventaire vol reconnu"); } if( GetIsPC(oVictim) ){ SendMessageToPC(oVictim, "Vol de "+GetName(oItem)+" par "+GetName(oThief)+sInfo ); } if( GetIsPC(oThief) ){ SendMessageToPC(oThief, "Vol de "+GetName(oItem)+" sur "+GetName(oVictim)+sInfo ); } if( (nHeight * nWidth > 2) && ( nWeight > 30 ) ){ SendMessageToPC(oThief,"Objet hors norme, restitution"); SendMessageToPC(oVictim,"Objet hors norme, restitution"); object oItemRetour = CopyItem(oItem, oVictim, TRUE) ; SetPlotFlag(oItemRetour, GetPlotFlag(oItem)); SetStolenFlag(oItemRetour, FALSE); SetIdentified(oItemRetour, GetIdentified(oItem)) ; int nValue = GetGoldPieceValue(oItem)/5 ; // pour correspondre au prix de vente des objets voles sur le Bouchon DestroyObject(oItem) ; int nPick = GetSkillRank(SKILL_PICK_POCKET,oThief) + d20() ; int nDetect = GetSkillRank(SKILL_SPOT,oVictim) + d20() ; if( nPick > nDetect ){ float fMarge = pow(10.0, IntToFloat((7 + nPick - nDetect)/10) ) ; if( FloatToInt(fMarge) < nValue ) nValue = FloatToInt(fMarge) ; SendMessageToPC(oThief,"compensation pour talent PickPocket : "+IntToString(nValue)+""); SendMessageToAllDMs("compensation pour talent PickPocket : "+IntToString(nValue)+""); GiveGoldToCreature(oThief,nValue) ; SendMessageToPC(oVictim,"compensation pour talent PickPocket : "+IntToString(nValue)+""); AssignCommand(oVictim,TakeGoldFromCreature(nValue,oVictim,TRUE)); // 3 de marge = 10 po, 6 => 20 po, 10 => 50po, 13 etc } } // } // } // } } |
Revenir en haut | |
darkheaven Acolyte Messages: 35 Localisation: nevers |
lylver : apres test de ton script, le voleur a un detail precis de ce quil vol dans la case adjointe a ceuue du dialogue, mais rien de marquer dans les logs
azazel : ca ne fais rien, normal? Edit : Apres relecture je crois que j'ai mal cromprit ton script, di moi si c'est ca : le voleur vole (oui oui je sais) , la victime recoit un message comme quoi elle a etait voler ainsi que le nom de l'item c'est ca? _________________ La vie n'est qu'une plume que le destin balade au grés du vent... |
Revenir en haut | |
Argyl Grand Sage du Conseil Messages: 704 |
Le but étant d'empécher le vol, si j'ai bien compris, il suffit d'interdir la compétence à toutes les classes.
Dans le skills.2da Modification du allclasscanuse 0 au lieu de 1 (si nécessaire, je ne sais plus si ce n'est pas déjà sur 0) Mettre la nécessité d'apprentissage sur 1 Retirer la compétence de tous les cls_skill_XXXXX.2da |
Revenir en haut | |
lylver Héros Messages: 274 |
darkheaven a écrit : lylver : apres test de ton script, le voleur a un detail precis de ce quil vol dans la case adjointe a ceuue du dialogue, mais rien de marquer dans les logs
suffit de mettre des WriteTimeStampedLogEntry(string sMesg) en sus des messages envoyés, c'est à la portée de tlm.
azazel : ca ne fais rien, normal? Edit : Apres relecture je crois que j'ai mal cromprit ton script, di moi si c'est ca : le voleur vole (oui oui je sais) , la victime recoit un message comme quoi elle a etait voler ainsi que le nom de l'item c'est ca? Le but de la chose était de limiter de façon générique les items volables sur un critère de poids et de dimension. Mais aussi de récompenser / compenser l'utilisation du talent pickpocket. |
Revenir en haut | |
darkheaven Acolyte Messages: 35 Localisation: nevers |
Le but du script que je recherche est juste que lorsqu'un voleur vole, son nom de compte soit marquer dans les logs avec celui de la personne qu'il a voler.
Rien de plus. _________________ La vie n'est qu'une plume que le destin balade au grés du vent... |
Revenir en haut | |
Semcatala Grand Sage du Conseil Messages: 951 |
Je crois qu'il n'existe pas de commande pour savoir qui à été volé et qui à volé.
Mais il y a je crois un autre moyen !!! D'abord , crée un petit script qui met en mémoire sur le mod pendant un court temps le tag de l'objet "perdu" par un joueur ainsi que le nom de celui qui à perdu un objet. Ensuite , met en mémoire le tag de l'objet " gagné " par un joueur , ainsi que le nom de celui qui l'a gagné. Ensuite , c'est simple , met une minuterie pour que soit effacée rapidement le tag de l'objet perdu , mais une minuterie pour quoi faire me demandera tu ? Et bien voilà l'idée , ça consisterais a comparer dans un court intervale de temps l'objet "perdu" par un joueur , et l'objet " gagné " par un autre joueur. Le raisonement consiste a dire que si à t = 0 secondes le joueur " Lucky luke " a perdu son cheval qui à pour tag " jolly_jumper " , alors si jamais à t =0,0001 secondes ( un temps trés proche on va dire !! ) un autre joueur gagne un cheval de tag " jolly_jumper " alors il y a eu vol du second joueur sur le premier ! En plus de la condition de temps pour garantir la bonne detection du voleur , tu peux aussi mettre une condition de nom de zone pour vérifier que les 2 joueurs étaient dans la même zone lors du vol ! Tu peux même pousser le vice jusqu'a détecter la distance en métres entre les 2 personnes pour donner au MD de solides arguments pour définir si il y a eu ou pas un vol ! Si les 2 joueurs étaient dans la même zone , à 10cm l'un de l'autre lors de l'incident , et que le script te dit qu'il y a eu vol , alors il n'y a aucun doute ! Car la probabilité qu'un joueur perde un objet de tag X et qu'un autre joueur gagne un objet de tag X à 1 seconde prés est quasi nulle ! EDIT: Aprés y avoir réfléchi , je pense qu'il sera impossible avec nwn de faire la différence entre un joueur qui " donne " , ou fait " commerce " d'un objet a un autre joueur , et un vol ! Dans les 2 cas il y a transfert d'objet d'un inventaire a l'autre , mais sans commande de script qui permette de savoir si il y a eu vol ou pas , il nous est il me semble impossible de faire la différence entre un transfert d'objet voulu , ou alors subit ! _________________ " La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG " La véritable école du Commandement est la culture générale. " CdG " Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F " La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG " La fin de l'espoir est le commencement de la mort. " CdG |
Revenir en haut | |
Argyl Grand Sage du Conseil Messages: 704 |
Et si en plus, il garde en mémoire l'utilisation de la compétence pickpocket ?
Je dis ça, autant je n'y connais rien... |
Revenir en haut | |
Semcatala Grand Sage du Conseil Messages: 951 |
Bon , ça m'apprendra a la fermer et a rechercher une solution avant de dire n'importe quoi !
La solution est la fonction GetStolenFlag() ( que j'ai découvert aujourd'hui ....... ! ) , qui récupére une balise mise a TRUE sur l'objet lorsqu'il est gagné par vol , et on récupére la valeur de cette balise avec cette fonction. Voici le script a mettre dans le "onacquieritem" du mod : NWScript :
void main() { object oPC = GetModuleItemAcquiredBy(); object objet = GetModuleItemAcquired(); object victime = GetModuleItemAcquiredFrom(); string nom_voleur = GetName(oPC); string nom_victime = GetName(victime); int balise_vol = GetStolenFlag(objet); if ( balise_vol == TRUE ) { SendMessageToPC(oPC,nom_voleur+ " a chourave quelque chose !"); SendMessageToPC(oPC,nom_victime+ " s'est fait chouraver quelque chose !"); WriteTimestampedLogEntry(nom_voleur + " XXXXXXXXXXXXXXXXXX VOL VOL VOL VOL XXXXXXXXXXXXXX"); WriteTimestampedLogEntry(nom_voleur + " a commis un larcin sur " + nom_victime); WriteTimestampedLogEntry(nom_voleur + " XXXXXXXXXXXXXXXXXX VOL VOL VOL VOL XXXXXXXXXXXXXX"); SetStolenFlag(objet,FALSE); } else { SendMessageToPC(oPC,nom_voleur+ " a ramasse quelque chose !"); } } l'inconvénient dans la detection de vol , c'est qu'on est obligé de remettre la balise a false aprés le gain de l'objet , sinon , si on pose l'objet au sol et qu'on le ramasse , le vol est a nouveau déclaré dans le fichier log alors qu'on l'a ramassé par terre ! _________________ " La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG " La véritable école du Commandement est la culture générale. " CdG " Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F " La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG " La fin de l'espoir est le commencement de la mort. " CdG |
Revenir en haut | |
AZAZEL11 Seigneur Messages: 156 |
Citation : l'inconvénient dans la detection de vol , c'est qu'on est obligé de remettre la balise a false aprés le gain de l'objet , sinon , si on pose l'objet au sol et qu'on le ramasse , le vol est a nouveau déclaré dans le fichier log alors qu'on l'a ramassé par terre ! GetIsSkillSuccessful(ACTION_PICKPOCKET); en mettant ca en condition, ca filtrerait amplement tous les unaquireditem ....mais je suis pas assez callé en script pour tester....c'est juste une idée comme ca pour vous^^. _________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
Revenir en haut | |
Semcatala Grand Sage du Conseil Messages: 951 |
AZAZEL11>
Citation : // Returns true if 1d20 roll + skill rank is greater than or equal to difficulty
je ne pense pas que ça puisse nous aider ! // - oTarget: the creature using the skill // - nSkill: the skill being used // - nDifficulty: Difficulty class of skill int GetIsSkillSuccessful(object oTarget, int nSkill, int nDifficulty) _________________ " La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG " La véritable école du Commandement est la culture générale. " CdG " Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F " La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG " La fin de l'espoir est le commencement de la mort. " CdG |
Revenir en haut | |
lylver Héros Messages: 274 |
darkheaven a écrit : Le but du script que je recherche est juste que lorsqu'un voleur vole, son nom de compte soit marquer dans les logs avec celui de la personne qu'il a voler.
O o ... c'est dans le script : tu éludes la partie qui ne te sert pas
Rien de plus. Semcatala a écrit : Je crois qu'il n'existe pas de commande pour savoir qui à été volé et qui à volé.
Teste mon script juste au dessus.
Je suis en train de parfaire le script, par exemple pour ne pas tenir compte lorsque tu récupères un objet volé dans un plaçable, ni pour enlever à tort un marqueur volé. Ca m'as l'air plus difficile ca, vu que je mets parfois des marqueurs volés pour baisser le prix des items à la revente (apparement c'est pas une bonne méthode). AZAZEL1 a écrit : GetIsSkillSuccessful(ACTION_PICKPOCKET); en mettant ca en condition, ca filtrerait amplement tous les unaquireditem ....mais je suis pas assez callé en script pour tester....c'est juste une idée comme ca pour vous^^.
Merci pour l'idée, ... vais voir comment exploiter ça_________________ TSLODOSS TN Bouchon 2 NWN-FF The DMFI |
Revenir en haut | |
Semcatala Grand Sage du Conseil Messages: 951 |
lylver> Une question , est ce que ton script fait la différence entre un " vol " et un " don " d'ojet d'un perso a un autre ?
Par exemple , je vais voler une dague sur un pnj , ensuite je donne cette dague a un autre joueur via le mode " commerce " avec les inventaires ouverts. A ce moment là , est ce que le joueur qui reçoit la dague est considéré comme étant un voleur ? _________________ " La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG " La véritable école du Commandement est la culture générale. " CdG " Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F " La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG " La fin de l'espoir est le commencement de la mort. " CdG |
Revenir en haut | |
lylver Héros Messages: 274 |
NWScript :
if( GetInventoryDisturbType() == INVENTORY_DISTURB_TYPE_STOLEN ){ SendMessageToPC(oThief,"Dernier evenement inventaire vol reconnu");} c'est pas parfait, c'est sur, j'ai eu des messages en posant des objets volés au sol. Donc je me demande dans quelles conditions l'évênement INVENTORY_DISTURB_TYPE_STOLEN est positionné. Jusqu'à présent par contre, pas de soucis lorsque l'on s'échange des objets. |
Revenir en haut | |
Harmelyo Chevalier Messages: 84 |
En regardant le nom de l'évènement, c'est lorsqu'un objet avec le flag "stolen" est déplacé depuis un inventaire. En clair dès que l'on joue avec un objet volé tu va lancé l'évènement
|
Revenir en haut | |
lylver Héros Messages: 274 |
Ben j'étais pas sur de savoir "quand" le flag "Stolen" est positionné, apparement c'est avant le déclenchement de l'évênement "modification de l'inventaire". Subtilité du moteur de jeu certes mais ca se comprend si ils ont fait cela modulaire.
en gros : l'objet est considéré volé alors que le voleur est encore en train de triturer dans la poche de la victime. |
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