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)
/*
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;
}
/*
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(oPossessor, ClearAllActions());
AssignCommand(oPossessor, ActionJumpToObject(oOwner));
AssignCommand(oPossessor, ActionGiveItem(oItem, oOwner));
SendMessageToPC(oPossessor, "Vous avez rendu l'objet :" + sItemName);
}
else
{
DeleteLocalObject(oItem, "ND_OWNER");
}
}
else
{
/* On Ne Fait rien */
}
}
}
}
/*
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(oLostBy, ActionTakeItem(oItem, oPossessor));
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(oLostBy, ActionTakeItem(oItem, oPossessor));
SendMessageToPC(oLostBy,"Vous avez recupere : " + sItemName);
}
break;
default:
/*Traitement du cas general : on pose par terre*/
if (GetIsObjectValid(GetAreaFromLocation(GetLocation(oItem))))
{
AssignCommand(oLostBy, ActionDoCommand(SetCommandable(FALSE, oLostBy)));
/* Blokage des actions du joueur */
AssignCommand(oLostBy, ActionSpeakString("Zut, j'ai perdu quelquechose !"));
AssignCommand(oLostBy, ActionMoveToObject(oItem, TRUE));
/* Mouvement Obligatoire ! ! ! */
AssignCommand(oLostBy, ActionPickUpItem(oItem));
/* Rammassage de l'objet */
SendMessageToPC(oLostBy,"Il ne faut pas perdre vos objets importants! ! !");
AssignCommand(oLostBy, ActionDoCommand(SetCommandable(TRUE, oLostBy)));
/* 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....