Script antivol

Répondre
Partager Rechercher
Bonjour

Je voudrait que certains objets ne puissent être voler.
Les objets en question on tous leurs nom commençant par "Orbe de"
voila le script que j'ai mit dans le OnAquieredItem :

object oItem = GetModuleItemAcquired();
object oVoleur = GetItemPossessor(oVitem);
object oProprio = GetModuleItemAcquiredFrom();
if (GetStringUpperCase(GetStringLeft(GetName(oVitem),4)) == "ORBE")
{
CreateItemOnObject(GetResRef(oItem),oProprio);
DestroyObject(oItem);
SendMessageToPC(oVoleur,"Cet objet ne peut être voler.");
}

Avec sa des que je lance le module...il plante

Quelqun pourrait il s'il vous plais :

1) m'expliquer pourquoi sa fait planter?
2) me donner la solution pour l'antivol?

Merci d'avance

Nalk
Salut à toi,

ton script est intéressant mais à priori il ne reconnaitra pas ton object oVitem. Fait des tests pour savoir si l'item est valide aussi et enfin, fait un test pour savoir si le PC est un joueur (pas un MD ni un PNJ).
Et puis ton script ne compile meme pas donc pas la peine de faire des tests avec le module.
Enfin, je crois aussi que si tu mets comme phrase "Cet objet ne peut être volé (<--)." ça ira beaucoup mieux !! (le compilateur n'aime pas les fautes de grammaire !!)

Prince Nexus.
Deja ici 2 fautes

Code PHP:

object oVoleur GetItemPossessor(oVitem);
object oProprio GetModuleItemAcquiredFrom(); 
A mon avis tu a inversé les declarations et la 2eme erreurs ai que ce n'est pas oVitem mais oItem

Un conseil sert toi du tag pour les selection c'est plus simple que le nom.
En l'état actuel, ton script ne compile pas

Commence par remplacer oVitem par oItem (à supposer que ce soit une erreur de frappe).

D'autre part, après moult tests j'en était arrivé à la conclusion que la fonction GetModuleItemAcquiredFrom() ne marchait pas. Donc, pour contourner le problème, tu peux utiliser le OnUnacquiredItem. Cela dit, je me trompe peut-être (sûrement même, vu que je n'avais jamais entendu parler de ce bug avant )

Ce genre de script est assez pénible à faire parce qu'il est difficile de faire les bons tests pour savoir s'il s'agit d'un DM, d'un PNJ, d'un PJ, si l'objet a été pris par terre ou ailleurs, etc.
Ca demande pas mal d'essais

Cela dit, avant de demander une solution sur le forum, commence au moins par faire en sorte que ton script compile. Il y a un sujet pour t'aider dans cette voie, que nous a amoureusement concocté Reyan : https://forums.jeuxonline.info/showthread.php?t=190739

Voilà voilà
J'ai fait des erreur dans la copie de mon script (faut dire que j'ai poster vers 4h du mat....)

voila le script et il compile *mon problème n'est pas la compilation du script* mon problème est que *si ce script est dans le OnAcquiereItem le module plante au chargement* quelqu'un peut il m'expliquer pourquoi???

//je commente et dite moi si je me goure quelque part svp

//l'objet que le pj vient de recevoir
object oItem = GetModuleItemAcquired();
//le pj qui a reçut l'objet
object oVoleur = GetItemPossessor(oItem);
//l'ancien proprietaire de l'objet (OU OBJECT_INVALID)
object oProprio = GetModuleItemAcquiredFrom();
//Si le nom de l'objet oItem commence par "Orbe"
if (GetStringUpperCase(GetStringLeft(GetName(oItem),4)) == "ORBE")
{
//creer un objet "orbe" identique sur l'ancien posseseur
CreateItemOnObject(GetResRef(oItem),oProprio);
//detruire l'objet volé
DestroyObject(oItem);
//envoyer un message au voleur
SendMessageToPC(oVoleur,"Cet objet ne peut etre vole.");
//ma touche "É" marche pas dans l'éditeur de script
}

Donc ce que je demande c'est :

1) pourquoi sa fait *planté le module juste après le chargement*?
2) Si c'est pas bon pourquoi?
3) Si y a un truc que j'ai mal ou pas du tout comprit quoi et ou?

Merci de vos réponses.

Nalk
Je serais toi, je commencerais par commenter la ligne avec le CreateItemOnObject().

Mais sinon, ton script semble devoir marcher tel qu'il est. Peut-être que le problème vient du GetModuleItemAcquiredFrom(), donc teste et reviens nous voir
GetModuleItemAcquired() est une fonction qui cause de nombreux ennuis (cf un autre post dont je ne me souviens plus le nom). Il faut repenser le script pour pouvoir le mettre dans onacquireitem du module cad mettre tous les tags des objets, testé s'ils sont dans l'inventaire du joueur (et non d'un MD ou d'un PNJ) et enfin le supprimer si tel est le cas.

Pour cette satanée fonction GetModuleItemAcquired, Bioware travaille dessus et prévoit de la modifier dans la 1.31 ou ultérieur : faut etre patient.

S'il y en a beaucoup, c'est fastidieux, mais bon, c'est jusqu'à maintenant le seul moyen...

Prince Nexus
Ce que je ne comprend pas c'est que tant que ceci n'est pas dans le script :

//créer un objet "orbe" identique sur l'ancien possesseur
CreateItemOnObject(GetResRef(oItem),oProprio);
//détruire l'objet volé
DestroyObject(oItem);

ça fonctionne sans pb. Dés que je met la création de l'objet puis sa destruction sa plante le module au chargement....
Mouarf, le programme boucle à l'infini : le proprio devient le voleur et le voleur le proprio....

Perso, je ne vois pas comment s'en sortir à part en mémorisant en permanent le nom du proprio en lui mettant un LocalInt.

J'espère avoir répondu à ta question...

Prince Nexus
Citation :
//ma touche "É" marche pas dans l'éditeur de script
Il y a un truc : tu tapes ton "é" dans le chercheur de fonctions (à droite), et tu fais un copier/coller.
Répondre

Connectés sur ce fil

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