NoDrop

Répondre
Partager Rechercher
Voila voila... je script plus ou moin pour un module persistant...
Et j'ai du régler un problem lié au drop de certains objets: Les joueurs collectent des runes qui leur permettent de franchir certains portails (ils n'optiennent la rune que sil ne l'ont pas et sous certaines conditions) or en dropant les runes les joueurs peuvent les dupliquer et donc les fournir a d'autres joueurs qui ainsi esquivent les zones dures et certaines quétes...

G du aussi gérer le drop de certains objets dans des containers spécifiques...

Voici mes scripts :
(Sachant qu'il y a quelques bugs : on peu interrompre manuellement le reramassage-auto d'une rune, dropper la rune en l'ayant mi dans un sac magique, si on ramasse une rune qu'un autre perso a laissé par terre on se retrouve teleporté a sa position si il est encore online)

Code PHP:

/*
obe_fgetisnodrop
needed by obe_onacquire & obe_onunacquire

- Script avec redef de la fonction GetIsNoDrop.
(Il n'y a en effet pas de fonction permettant de mettre
un objet en NoDrop)

- Pour rajouter un objet a ne pas perdre mettre son tag
dans la condition du if sur le meme model ke ceux deja en place.
*/

int GetIsNoDrop(object oItem)
{

    
int iNoDrop;
    
string sItemTag GetTag(oItem);

    if (
        (
sItemTag == "Recall_0") ||
        (
sItemTag == "recall_1") ||
        (
sItemTag == "recall_2") ||
        (
sItemTag == "recall_3") ||
        (
sItemTag == "recall_4") ||
        (
sItemTag == "recall_5") ||
        (
sItemTag == "recall_6") ||
        (
sItemTag == "recall_7") ||
        (
sItemTag == "recall_8") ||
        (
sItemTag == "recall_9") ||
        (
sItemTag == "recall_10") ||
        (
sItemTag == "recall_11") ||
        (
sItemTag == "recall_evil00") ||
        (
sItemTag == "recall_evil02") ||
        (
sItemTag == "recall_evil03") ||
        (
sItemTag == "recall_evil05") ||
        (
sItemTag == "recall_evil06") ||
        (
sItemTag == "recall_evil07") ||
        (
sItemTag == "recall_evil08") ||
        (
sItemTag == "recall_evil09") ||
        (
sItemTag == "recall_evil10") ||
        (
sItemTag == "Elf1") ||
        (
sItemTag == "Elf2") ||
        (
sItemTag == "Elf3") ||
        (
sItemTag == "Elf4") ||
        (
sItemTag == "Elf5") ||
        (
sItemTag == "Elf6") ||
        (
sItemTag == "Antidote")
        )


    {
        
iNoDrop TRUE;
    }
    else
    {
        
iNoDrop FALSE;
    }

    return 
iNoDrop;


Code PHP:

/*
obe_onacquire
need obe_fgetisnodrop

- Ce script fait ke si on accepte une rune d'1 Pc on lui la rend direct.

- GoS: executer au debut de acquireditems apres les declarations de variables:
    ExecuteScript("obe_onacquire", oPC);
*/

#include "obe_fgetisnodrop"

void main()
{
    
object oItem GetModuleItemAcquired();

    if (
GetIsNoDrop(oItem))
    {
        
object oOwner GetLocalObject(oItem"ND_OWNER");
        
string sOwnerName GetName(oOwner);
        
object oPossessor GetItemPossessor(oItem);
        
string sPossessorName GetName(oPossessor);
        
string sItemName GetName(oItem);

        if (!
GetIsPC(oOwner))
        {
            if (
GetIsPC(oPossessor))
            {
                
SetLocalObject(oItem"ND_OWNER"oPossessor);
            }
            else
            {
                
DeleteLocalObject(oItem"ND_OWNER");
            }
       }
       else
       {
            if (
sOwnerName != sPossessorName)
            {
                if (
GetIsPC(oPossessor))
                {
                    
AssignCommand(oPossessorClearAllActions());
                    
AssignCommand(oPossessorActionJumpToObject(oOwner));
                    
AssignCommand(oPossessorActionGiveItem(oItemoOwner));
                    
SendMessageToPC(oPossessor"Vous avez rendu l'objet :" sItemName);
                }
                else
                {
                    
DeleteLocalObject(oItem"ND_OWNER");
                }
            }
            else
            {
                
/* On Ne Fait rien */
            
}
        }

    }


Code PHP:

/*
obe_onunacquire
need obe_fgetisnodrop

- A placer dans OnUnAquireItem

- Ce script force le joueur a rammasser les objets def en nodrop
dans obe_fgetisnodrop s'il les pose parterre

*/


#include "obe_fgetisnodrop"

void main()
{
    
object oItem GetModuleItemLost();

    if (
GetIsNoDrop(oItem))
    {
        
object oLostBy GetLocalObject(oItem"ND_OWNER");

        if (
GetIsPC(oLostBy))
        {
            
string sItemName GetName(oItem);
            
object oPossessor GetItemPossessor(oItem);

            switch (
GetObjectType(oPossessor))
            {

            case 
OBJECT_TYPE_STORE:
            
/*Traitement du cas des magazins
            (inutile car objets invendables mais identique au cas des coffres)
            mais mis au cas ou... doit buguer avec l'or)*/
                
AssignCommand(oLostByActionTakeItem(oItemoPossessor));
                
SendMessageToPC(oLostBy,"Vous avez recupere : " sItemName);
            break;
            case 
OBJECT_TYPE_PLACEABLE:
            
/*Traitement de la mise dans un coffre*/
                
if ( ! (
                    ( ( 
GetTag(oItem) == "Antidote" )    &&  ( GetTag(oPossessor) == "Gob_Roc" ) )
                ||  ( ( 
GetTag(oItem) == "Elf1" )        &&  ( GetTag(oPossessor) == "Elf1_A" ) )
                ||  ( ( 
GetTag(oItem) == "Elf2" )        &&  ( GetTag(oPossessor) == "Elf2_A" ) )
                ||  ( ( 
GetTag(oItem) == "Elf3" )        &&  ( GetTag(oPossessor) == "Elf3_A" ) )
                ||  ( ( 
GetTag(oItem) == "Elf4" )        &&  ( GetTag(oPossessor) == "Elf4_A" ) )
                ||  ( ( 
GetTag(oItem) == "Elf5" )        &&  ( GetTag(oPossessor) == "Elf5_A" ) )
                ||  ( ( 
GetTag(oItem) == "Elf6" )        &&  ( GetTag(oPossessor) == "Elf6_A" ) )
                ) )
                {
                    
AssignCommand(oLostByActionTakeItem(oItemoPossessor));
                    
SendMessageToPC(oLostBy,"Vous avez recupere : " sItemName);
                }
            break;

            default:
            
/*Traitement du cas general : on pose par terre*/
                
if (GetIsObjectValid(GetAreaFromLocation(GetLocation(oItem))))
                {
                    
AssignCommand(oLostByActionDoCommand(SetCommandable(FALSEoLostBy)));
                    
/* Blokage des actions du joueur */
                    
AssignCommand(oLostByActionSpeakString("Zut, j'ai perdu quelquechose !"));
                    
AssignCommand(oLostByActionMoveToObject(oItemTRUE));
                    
/* Mouvement Obligatoire ! ! ! */
                    
AssignCommand(oLostByActionPickUpItem(oItem));
                    
/* Rammassage de l'objet */
                    
SendMessageToPC(oLostBy,"Il ne faut pas perdre vos objets importants! ! !");
                    
AssignCommand(oLostByActionDoCommand(SetCommandable(TRUEoLostBy)));
                    
/* Deblokage des actions du joueur */
                
}
                else
                {
                
/* Cas restant: on donne a un autre joueur : traite dans obe_onacquire*/
                
}
            }
        }
    }


Cela marche mais peut etre que certains test negatif m'ont échapé...
Merci pour toutes vos idées, commentaires, améliorations, informations....
En fait, le problème, c'est que lorsque le joueur as la rune, et qu'il la pose a terre, il peu en obtenir une 2e.

Il te suffi de flagger le joueur comme quoi il a déjà eu la rune et de ne plus lui redonner ensuite

Comme ca s'il la donne a un autre ... tant pis pour lui, il ne pourra plus passer le portail.
Le problème... c'est que malheureusement notre serveur n'est pas un serveur pro (plantage...plantage) et que le mod n'en étant pas a sa version définitive (évolution constante en fait...)

Les joueurs se retrouvent déflaggé a chaque redémarrage du serveur (sinon je pense qu'on aurais eu seulement une rune et des droits de passage en flag)

Donc voila... si vous avez une solution ou simplement une amélioration de mes scripts originaux.... Merci D'avance ! ! !
Répondre

Connectés sur ce fil

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