[scipt] objet indroppable + question

Répondre
Partager Rechercher
J'ai trouvé (merci a lendraste) un script pour rendre des objets "indroppables" le voici ( a mettre dans le OnUnacquireItem du module)

Code PHP:

void main() 

  
string sTagList ";TAGOBJET1;TAGOBJET2;TAGOBJET3;"//Liste des tags des objets indropables séparé par des points-virgules et sans espaces avec ; au début et à la fin 
  
object oCreature GetModuleItemLostBy(); //Créature ayant dropé l'objet (de quelque façon que ça soit) 
  
object oItem GetModuleItemLost(); //Objet dropé (quelle que soit la manière) 
  
string sItemName GetName(oItem); //Récupération du nom de l'objet 
  
string sItemTag GetTag(oItem); //récupération du tag de l'objet 
  
if (FindSubString(sTagList";" sItemTag ";")>=0
  { 
    
//Le tag de l'objet appartient à la liste des tag d'objets indropables 
    
CopyObject(oItemGetLocation(oCreature), oCreaturesItemTag); // Copie de l'objet dropé dans l'inventaire de la créature 
    
DestroyObject(oItem); // Destruction de l'objet dropé 
    
if (GetIsPC(oCreature)) 
    { 
      
// La créature est un joueur, envoie d'un message 
      
SendMessageToPC(oCreature"Vous ne pouvez pas vous débarrasser de " sItemName); 
    } 
  } 

j'aurai 2 petites questions :
1. j'aimerai fusionner ce script avec mon script onunacquireitem :

Code PHP:

void main()
{
    
object oPerdu GetModuleItemLost();
DelayCommand(60.0ExecuteScript("eboueurs"oPerdu));



je suppose que c pas trop compliqué mais j'aime mieux etre sur!

2. j'aimerai jouer sur la possession de cet objet : est-il possible de mettre un script pour que la possession de tel ou tel anneau change la faction ? : il y a un 'anneaubon" et un "anneaumauvais". si je fais deux nouvelles factions "bon" et "mauvais" qui sont hostiles, est ce que les joueurs se verront hostiles? comme ca pas besoin de script compliqué a mettre dans le oncliententer. vous suivez mon raisonnement??
Juste une question:

Est-ce que ce script permet également de ne pas pouvoir échanger l'objet non-droppable ? je pense que non, sinon ca ne servirai à rien...
Dommage, ce script etait super mais ce problème le fout à l'eau.
bon, j'ai regardé un peu dans les archives et j'ai pas vu grand chose, juste une phrase de Mercius qui dit qu'il a vu ca sur le vault. donc je vais aller voir, mais une question : je suppose que indroppable n'est pas anglais, il y a t il un mot anglais qui corresponde?

sinon, il y a une piste a peut etre exploiter (mais je sais pas du tout si ca peut donner qq chose ) : j'ai un eboueur qui elimine tous les objets au sol apres 45 sec. et lors d'un marchandage de plus de 45 sec, l'objet en train d'etre marchandé disparait. je suppose qu'il est en quelque sorte considéré comme "au sol"?? je ne sais pas si ca peut vraiment aider.
Utilise plutôt " No drop script" dans le moteur de recherche, tout simplement.
j'avais vu la v1 de ce script par le meme. j'ai telechargé la v2 mais la, je vais avoir besoin d'un gros coup de main.

1. expliquer un peu le fonctionnement de ce script : que fait il lorsqu'on drop un objet ou qu'ion essaye de l'échanger?

2. je suis pas tres fort en anglais et encore moins avec un vocabulaire spécial pour les scripts, ... donc si qq'un pouvait me traduire en gros le mode d'emploi

Citation :

Attached are a set of scripts for implementing No-Drop and Lore items.

Installation instructions:

1) Import NoDropv2.erf. Ignore the warning about i_tagtests.

2) Update i_tagtests::GetIsNoDropItem() and GetIsLore() to include the tags of the items you want to designate as "No-Drop" or "Lore". There are sample tags that should be replaced or removed.

3) Incorporate s_unacquireitem into Module::OnUnAcquireItem.

4) Incorporate s_acquireitem into Module::OnAcquireItem.

No-Drop items should be set to PLOT to prevent a player from repeatedly selling the same item to a merchant. The item is "stolen" from the merchant's inventory *AFTER* the item is sold and the player receives gold in exchange.

NOTE: A message is displayed when the item "mysteriously" reappears in the PC's inventory. This may be confusing unless the player has some way to know he has a No-Drop item and what one is.

NOTE: All item containers are automatically set to No-Drop.

NOTE: If an item is No-Drop *and* Lore, a duplicate will be destroyed if picked up.
et puis les scripts, le point 3) et 4) je comprend quand meme, mais le 2) pas tout je suppose que je dois mettre mes tags d'objets indroppable au bon endroit, mais c'est quoi "lore"?

il y a autre chose que je comprend pas : en regardant les scripts il disent qu'il faut en mettre 2 dans le OnAcquireItem et 2 dans le OnUnacquireItem?? pas tout compris je vous mets les scripts au cas ou

script s_acquireitem
Code PHP:

/*
    s_acquireitem - example script for incorporation into OnAcquireItem
*/

#include "i_tagtests"

void main()
{

object oItem GetModuleItemAcquired();
object oAcquirer GetItemPossessor(oItem);

if (
GetIsNoDrop(oItem))
    
ExecuteScript("s_nodrop_pickup"oAcquirer);

if (
GetIsLore(oItem))
    
ExecuteScript("s_lore_pickup"oAcquirer);


scripts_lore_pickup
Code PHP:

/*
    s_lore_pickup - "Lore" items (from EQ)

This script prevents a PC from collecting more than one item
designated as "Lore"

To use:

1)  Incorporate this script into Module::OnAcquireItem. s_acquireitem,
    included with this package, is an example

2)  Update the list of Tags in GetIsLore() (in i_tagtests)
    to include the items you designate as Lore

3)  Recompile this script


Author: Scott Thorne
E-mail: [email]Thornex2@Wans.net[/email]
Updated: Sept 01, 2002

*/

#include "i_tagtests"

int AlreadyHaveOne(object oOriginal);


void main () {

object oItem GetModuleItemAcquired();

if (
GetIsPC(OBJECT_SELF)) {

    if (
AlreadyHaveOne(oItem)) {

        if (
GetIsNoDrop(oItem)) {

            
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_MAGBLUE), OBJECT_SELF);
            
SpeakString("Yikes! It just exploded in my hands!");
            
DestroyObject(oItem);

        } else {

            
ActionDoCommand(SetCommandable(FALSE));
            
ActionDoCommand(ClearAllActions());
            
ActionSpeakString("Hmm, I already have one of these.");
            
ActionPutDownItem(oItem);
            
ActionDoCommand(SetCommandable(TRUE));

        }
    }

}  
/* if */

}  /* main() */



/* check for an equipped item matching the original's tag */
int SlotMatch(object oOriginalint iSlot) {

object oItem GetItemInSlot(iSlot);
int iSlotMatch = ((GetTag(oItem) == GetTag(oOriginal)) && (oItem != oOriginal));

return 
iSlotMatch;
}


/* check inventory and equipped items to see if they already have an item */
int AlreadyHaveOne(object oOriginal) {

int iAlreadyHaveOne FALSE;

string sItemTag GetTag(oOriginal);
object oItem GetFirstItemInInventory();
while (
GetIsObjectValid(oItem)) {

    if ((
GetTag(oItem) == sItemTag) && (oItem != oOriginal)) {

            
iAlreadyHaveOne TRUE;
            break;

    }

    
oItem GetNextItemInInventory();

}  
/* while */


/* check equipped slots too as they are seperate from inventory */
if (!iAlreadyHaveOne) {

    
iAlreadyHaveOne TRUE;

    do {
    if (
SlotMatch(oOriginalINVENTORY_SLOT_ARMS)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_ARROWS)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_BELT)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_BOLTS)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_BOOTS)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_BULLETS)) break;
    
//if (SlotMatch(oOriginal, INVENTORY_SLOT_CARMOUR)) break;
    
if (SlotMatch(oOriginalINVENTORY_SLOT_CHEST)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_CLOAK)) break;
    
//if (SlotMatch(oOriginal, INVENTORY_SLOT_CWEAPON_B)) break;
    //if (SlotMatch(oOriginal, INVENTORY_SLOT_CWEAPON_L)) break;
    //if (SlotMatch(oOriginal, INVENTORY_SLOT_CWEAPON_R)) break;
    
if (SlotMatch(oOriginalINVENTORY_SLOT_HEAD)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_LEFTHAND)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_LEFTRING)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_NECK)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_RIGHTHAND)) break;
    if (
SlotMatch(oOriginalINVENTORY_SLOT_RIGHTRING)) break;

    
iAlreadyHaveOne FALSE;

    } while (
FALSE);

}  
/* if */

return iAlreadyHaveOne;

}  
/* AlreadyHaveOne() */ 
script s_nodrop_drop
Code PHP:

/*
    s_nodrop_drop - "No Drop" items (from EQ)

This script prevents a PC from attempting to drop, barter, sell
or place items designated as "No Drop"

To use:

1)  Incorporate this script into Module::OnUnAcquireItem. s_unacquireitem,
    included with this package, is an example

2)  Update the list of Tags in GetIsNoDrop() (in i_tagtests)
    to include the items you designate as No-Drop


Author: Scott Thorne
E-mail: [email]Thornex2@Wans.net[/email]
Updated: Sept 01, 2002

*/

//#include "i_tagtests"

void main()
{
object oItem GetModuleItemLost();

if (
GetIsPC(OBJECT_SELF)) {

    
string sItemName GetName(oItem);
    
object oPossessor GetItemPossessor(oItem);

    switch (
GetObjectType(oPossessor)) {

    case 
OBJECT_TYPE_CREATURE:

//Debug("Bartered with a PC or taken by an NPC");
        
break;  /* no action, PC will give it back in OnAcquireItem */


    
case OBJECT_TYPE_STORE:

//Debug("Sold to a merchant");
        
ActionTakeItem(oItemoPossessor);
        
SendMessageToPC(OBJECT_SELF"The "sItemName " mysteriously reappears in your pack!");
        break;


    case 
OBJECT_TYPE_PLACEABLE:

//Debug("Placed into a container");
        
ActionTakeItem(oItemoPossessor);
        
SendMessageToPC(OBJECT_SELF"The "sItemName " mysteriously reappears in your pack!");
        break;


    default:

        if (
GetIsObjectValid(GetAreaFromLocation(GetLocation(oItem)))) {

//Debug("Dropped on the ground");
            
ActionDoCommand(SetCommandable(FALSEOBJECT_SELF));
            
ActionSpeakString("Oops, I dropped something!");
            
ActionMoveToObject(oItemTRUE);
            
ActionPickUpItem(oItem);
            
ActionDoCommand(SetCommandable(TRUEOBJECT_SELF));

        } else {

//Debug("In barter window");
            /* no action, PC will give it back in OnAcquireItem */

        
}

    }  
/* switch */

}  /* if GetIsPC() */

}  /* main() */ 
script s_nodrop_pickup
Code PHP:

/*
    s_nodrop_pickup - "No Drop" items (from EQ)

This script prevents a PC from attempting to drop, barter, sell
or place items designated as "No Drop"

To use:

1)  Incorporate this script into Module::OnAcquireItem. s_acquireitem,
    included with this package, is an example

2)  Update the list of Tags in GetIsNoDrop() (in i_tagtests)
    to include the items you designate as No-Drop


Author: Scott Thorne
E-mail: [email]Thornex2@Wans.net[/email]
Updated: Sept 01, 2002

*/

//#include "i_tagtests"

void main()
{

object oItem GetModuleItemAcquired();
string sItemName GetName(oItem);
object oOwner GetLocalObject(oItem"ND_OWNER");
string sOwnerName GetName(oOwner);
//object oPossessor = GetItemPossessor(oItem);
string sPossessorName GetName(OBJECT_SELF);

if (!
GetIsPC(oOwner)) {

    if (
GetIsPC(OBJECT_SELF)) {

//Debug("Branding no-drop item " + sItemName + " to " + sPossessorName);
        
SetLocalObject(oItem"ND_OWNER"OBJECT_SELF);

    } else {

//Debug("No-drop item " + sItemName + " picked up by NPC " + sPossessorName);
        
DeleteLocalObject(oItem"ND_OWNER");  /* Clear ownership */

    
}

} else {

    if (
sOwnerName != sPossessorName) {

        if (
GetIsPC(OBJECT_SELF)) {

//Debug("PC returning no-drop item " + sItemName + ", belongs to " + sOwnerName);
            
ActionDoCommand(SetCommandable(FALSE));
            
ActionDoCommand(ClearAllActions());
            
ActionJumpToObject(oOwner);
            
ActionGiveItem(oItemoOwner);
            
ActionDoCommand(SetCommandable(TRUE));

            
SendMessageToPC(OBJECT_SELF"The " sItemName " mysteriously vanishes from your pack!");

        } else {

//Debug("NPC took no-drop item");
            
DeleteLocalObject(oItem"ND_OWNER"); /* Clear ownership */

        
}

    } else {

//Debug("Re-acquiring own no-drop item " + sItemName);
        /* No action, re-acquiring own item */
    
}

}  
/* if */

}  /* main() */ 
s_unacquireitem
Code PHP:

/*
    s_unacquireitem - example script for incorporation into OnUnAcquireitem
*/

#include "i_tagtests"

void main()
{

object oItem GetModuleItemLost();

if (
GetIsNoDrop(oItem)) {

    
object oLostBy GetLocalObject(oItem"ND_OWNER");

    if (
GetIsObjectValid(oLostBy))
        
ExecuteScript("s_nodrop_drop"oLostBy);

}


script i_tagtests
Code PHP:

/*
    i_tagtests - "No Drop" and "Lore" items (from EQ)

This script is used by other scripts that prevent a PC from
attempting to drop, barter, sell or place items designated as
"No Drop" or collect more than one item designated as "Lore".


To use:

1) Update the list of Tags to include the items you designate as NoDrop
   in GetIsNoDrop() and Lore in GetIsLore()

2) Recompile all referencing scripts


Author: Scott Thorne
E-mail: [email]Thornex2@Wans.net[/email]
Updated: Sept 01, 2002

*/


/* update the list of tags for items to be designated No-Drop */
/* do not remove the last condition (w/BASE_ITEM_LARGEBOX) */
int GetIsNoDrop(object oItem) {

int iNoDrop;
string sItemTag GetTag(oItem);

if ((
sItemTag == "<your stuff here>") ||
    (
sItemTag == "<your stuff here>") ||
    (
GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX))
{
        
iNoDrop TRUE;

} else {

        
iNoDrop FALSE;
}

return 
iNoDrop;
}


/* update the list of tags for items to be designated Lore */
int GetIsLore(object oItem) {

int iLore;
string sItemTag GetTag(oItem);

if ((
sItemTag == "<your stuff here>") || // je suppose que c'est ici qu'on mets son tag
    
(sItemTag == "<your stuff here>") ||
    (
sItemTag == "<your stuff here>"))
{
        
iLore TRUE;

} else {

        
iLore FALSE;
}

return 
iLore;
}


void Debug(string sMessage) {
    
WriteTimestampedLogEntry(sMessage);

    
object oPC GetFirstPC();
    while (
GetIsPC(oPC)) {
        
SendMessageToPC(oPCsMessage);
        
oPC GetNextPC();
    }

est ce que un script rend un objet indroppable et un autre inmarchandable et c'est pour ca qu'il y en a deux ou je me trompe??

merci de m'aider
Le script est fort simple.

Les script s_acquire et s_unacquire sont à ajouter au script déjà en place sur les évènements du module correspondant.

i_tagtest est la bibliothèque dans laquelle tu mets le TAG des objets unique ou qui ne peuvent être droppé. Et voilà.

Comment ça marche:

Chaque fois qu'un joueur récupère (OnAcquireItem) ou dépose un objet (OnUnacquireItem), un vérification est faîte avec les TAG présent dans i_tagtest.

Lore, c'est pour les objets "légendaires" ou unique, pratique si tu interdit à un joueur d'avoir deux fois le même objet. L'objet est simplement détruit.

Pour déposséder d'un objet, le script fait un test sur où va atterrir l'objet. Une autre créature, un contenant ou un magasin.

Il y a aussi un script qui fait un test en cas de vol.

Je crois avoir tout dit.


PS: désolé si c'est un peu décousu, un peu fatigué.
Citation :
Provient du message de Archamedes_Fr

Pour déposséder d'un objet, le script fait un test sur où va atterrir l'objet. Une autre créature, un contenant ou un magasin.
donc je suppose que une autre creature considere aussi un echange entre 2 PJ donc objet inmarchandable?

et pour les autres scripts genre "script s_nodrop_drop", on en fait quoi, ca ne sert pas ici ou ce sont des includes??

edit : j'ai mis les script dans le acquireitem et unacquireitem mais j'arrive a dropper mes items dont j'ai rajouté la tag dans le script i_tagtest ?
ok ca fonctionne pour le drop. il y a juste le marchandage que j'ai pas su testé encore (si qq'un peut me dire si ca fonctionne aussi pour le marchandage)

et j'ai aussi 2-3 phrases a faire traduire svp

Yikes! It just exploded in my hands

mysteriously vanishes from your pack

voila merci des renseignements
"Hé ! Ca vient de me sauter à la figure !"
sItemName + " a mystérieusement disparu de votre sac à dos..."
Non ? (la première est un peu interprétée mais je trouve que "Ca vient de m'exploser dans les mains" ne sonne pas bien)
merci

et encore une question : puis je assigner une faction a un anneau? comme ça lorsque un pj ayant l'anneau 1 rencontrera un pj avec l'anneau 2, ils se verront ennemis?
Tu peux faire un test pour savoir quel anneau porte le pj a l'entree du module et lui attribuer une faction en permanence. Il y a deja eu un post il n'y a pas longtemps sur l'attribution de faction avec un objet de depart (obtenu apres un choix de camp) teste a l'entree du module
Bon, bah j'ai cherché et j'ai pas trouvé (meme avec le mode d'emploi des archives via google) si qq'un pouvait me mettrer le lien, ca serait tres sympa.

merci d'avance
un petit probleme de fusion de script, svp, pouvez m'aider??

voici les deux scripts a fusionner

Code PHP:

void main()
{
    
object oPerdu GetModuleItemLost();
DelayCommand(60.0ExecuteScript("eboueurs"oPerdu));



et

Code PHP:

/*
    s_unacquireitem - example script for incorporation into OnUnAcquireitem
*/

#include "i_tagtests"

void main()
{

object oItem GetModuleItemLost();

if (
GetIsNoDrop(oItem)) {

    
object oLostBy GetLocalObject(oItem"ND_OWNER");

    if (
GetIsObjectValid(oLostBy))
        
ExecuteScript("s_nodrop_drop"oLostBy);

}


merci d'avance
Citation :
Provient du message de xelone
[i]un petit probleme de fusion de script, svp, pouvez m'aider??

voici les deux scripts a fusionner

Code PHP:

/*
    s_unacquireitem - example script for incorporation into OnUnAcquireitem
*/

#include "i_tagtests"

void main()
{

object oItem GetModuleItemLost();

if (
GetIsNoDrop(oItem)) {

    
object oLostBy GetLocalObject(oItem"ND_OWNER");

    if (
GetIsObjectValid(oLostBy))
        
ExecuteScript("s_nodrop_drop"oLostBy);

}
DelayCommand(60.0ExecuteScript("eboueurs"oPerdu));


Voila.


PS : quand on a un probleme de script, je le rappelle, c'est souvent plus simple pour les debuggeurs de savoir exactement l'erreur (ie : noter le message d'erreur de compile ou preciser ce qui se deroule mal lors de l'execution)

Merci ^^
merci bcp. en fait ici, il y avait pas de probleme, c juste que je sais pas les compiler ensemble et au lieu de faire une grosse connerie, je prefere demander a ceux qui savent
Répondre

Connectés sur ce fil

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