Voilà donc le système de respawn de coffre, et de drops de monstres, fait par Thalion, et un peu modifié par moi (pas trop quand même
).
J'ai testé, ça fonctionne correctement.
----------------------------------------
Respawn de coffres :
Il suffit de mettre ce script dans le OnOpen d'un coffre.
//::///////////////////////////////////////////////
//:: OnOpenCoffre
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Ce script permet de faire respawn les items d'un
coffre avec une probabilite.
Pour l'utiliser :
Le coffre doit avoir un tag de la forme "X_ce que vous voulez"
avec pour X l'intervalle de temps en seconde entre
2 respawns. Puis il faut placer dedans
les items qui doivent respawn, avec un tag de la forme
"n_resref" ou "n" est le pourcentage de chance que l'item
apparaisse et "resref" le resref de l'item en question.
*/
//:://////////////////////////////////////////////
//:: Created By: Tahlion, beta et modifs par Mercius
//:: Created On: 12/05/2003 18:36
//:://////////////////////////////////////////////
void main()
{
int iNbItem = GetLocalInt(OBJECT_SELF,"nombre_item");
if(iNbItem == 0)
{
object oItem = GetFirstItemInInventory(OBJECT_SELF);
int i = 0;
while(GetIsObjectValid(oItem))//boucle...
{
i++;
string sTagProba = GetTag(oItem);
//on prend la partie droite de l'item, donc le resref
SetLocalString(OBJECT_SELF,"item" + IntToString(i), GetStringRight(sTagProba, GetStringLength(sTagProba) - 1 - FindSubString(sTagProba,"_")));
//on prend la partie gauche, donc le pourcentage de chance d'apparition de l'item
SetLocalInt(OBJECT_SELF,"proba" +IntToString(i), StringToInt(GetStringLeft(sTagProba, FindSubString(sTagProba,"_"))));
//on detruit l'item
DestroyObject(oItem);
oItem = GetNextItemInInventory(OBJECT_SELF);
}
SetLocalInt(OBJECT_SELF,"nombre_item",i);
SetLocalInt(OBJECT_SELF,"okgenere",1);//on peut generer les items maintenant
iNbItem = i;
}
if(iNbItem > 0 && GetLocalInt(OBJECT_SELF,"okgenere") == 1)//si la boucle ci-dessus a ete faite
{
int i;
for(i = 1; i <= iNbItem; i++)
{
//si l'item n'existe pas deja dans le coffre
if(!GetIsObjectValid(GetItemPossessedBy(OBJECT_SELF, GetLocalString(OBJECT_SELF, "item" + IntToString(i)))))
{
//on calcul avec le pourcentage, pour savoir si l'item doit apparaitre ou pas
if(d100() <= GetLocalInt(OBJECT_SELF,"proba" + IntToString(i)))
{
//on cree l'item
CreateItemOnObject(GetLocalString(OBJECT_SELF,"item" + IntToString(i)));
}
}
}
SetLocalInt(OBJECT_SELF, "okgenere", 0);
string sTagSelf = GetTag(OBJECT_SELF);
DelayCommand(StringToFloat(GetStringLeft(sTagSelf, FindSubString(sTagSelf,"_"))), SetLocalInt(OBJECT_SELF, "okgenere", 1));
}
}
Pour l'utiliser, il suffit de faire comme indiqué en commentaires dans le header.
Précisions : Vous avez un objet dans la palette, dont le tag et le resref sont pareils. Vous le mettez dans l'inventaire du coffre, puis vous l'éditez dans le coffre (clique droit de la souris dessus) et vous rajoutez devant le tag, le pourcentage de chance que l'item soit dans le coffre (de 1 à 100) suivi de "_".
Vous enregistrez et voilà
NB : le temps commence à se décompter la première fois que le coffre s'ouvre, il ne contiendra donc rien dedans lors de la première ouverture du coffre.
-----------------------------------
Drops de monstres :
Script à mettre dans le OnSpawn du monstre.
//::///////////////////////////////////////////////
//:: OnSpawnMonstreDrop
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Systeme de drop d'item pour les monstres.
Ce script est a placer dans le OnSpawn du monstre
en question.
Utilisation :
Placer les items que l'on veut faire dropper
dans l'inventaire du monstre en question.
Son tag doit etre de la forme "n_resref", ou "n"
est le pourcentage de chance de drop de l'item et
"resref" le resref de l'item en question.
*/
//:://////////////////////////////////////////////
//:: Created By: Thalion, beta et modifs par Mercius
//:: Created On: 12/05/2003 18:54
//:://////////////////////////////////////////////
#include "NW_I0_GENERIC"
void main()
{
object oItem = GetFirstItemInInventory(OBJECT_SELF);
int iNbItem = 0;
string sTagProba;
while(GetIsObjectValid(oItem))//boucle...
{
iNbItem++;
sTagProba = GetTag(oItem);
//on prend la partie droite de l'item, le resref
SetLocalString(OBJECT_SELF,"item" + IntToString(iNbItem), GetStringRight(sTagProba, GetStringLength(sTagProba) - 1 - FindSubString(sTagProba,"_")));
//on prend la partie gauche de l'item, le pourcentage de chance
SetLocalInt(OBJECT_SELF,"proba" + IntToString(iNbItem), StringToInt(GetStringLeft(sTagProba, FindSubString(sTagProba,"_"))));
//on detruit l'item
DestroyObject(oItem);
oItem = GetNextItemInInventory(OBJECT_SELF);
}
if(iNbItem > 0)
{
int i;
for(i = 1;i <= iNbItem;i++)
{
//on calcule avec le pourcentage pour savoir si l'item doit apparaitre ou pas
if(d100() <= GetLocalInt(OBJECT_SELF,"proba" + IntToString(iNbItem)))
{
//on cree l'item
CreateItemOnObject(GetLocalString(OBJECT_SELF,"item" + IntToString(iNbItem)));
}
//on supprime les flags
DeleteLocalString(OBJECT_SELF,"item" + IntToString(iNbItem));
DeleteLocalInt(OBJECT_SELF,"proba" + IntToString(iNbItem));
}
}
AssignCommand(OBJECT_SELF,ActionEquipMostDamagingRanged()); //equipe la meilleur arme a distance et s'il n'y en a pas la meilleur arme de corp a corp
AssignCommand(OBJECT_SELF,ActionEquipMostEffectiveArmor());
AssignCommand(OBJECT_SELF,ActionRandomWalk());
}
Ce script suivant est à mettre dans le OnDeath du monstre.
//::///////////////////////////////////////////////
//:: OnDeathMonstreDrop
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Systeme de drop d'item pour les monstres.
Ce script est a placer dans le OnDeath du monstre
en question.
Utilisation :
Placer les items que l'on veut faire dropper
dans l'inventaire du monstre en question.
Son tag doit etre de la forme "n_resref", ou "n"
est le pourcentage de chance de drop de l'item et
"resref" le resref de l'item en question.
*/
//:://////////////////////////////////////////////
//:: Created By: Thalion, beta et modifs par Mercius
//:: Created On: 12/05/2003 19:04
//:://////////////////////////////////////////////
#include "NW_I0_GENERIC"
//fonction "Drop"
void Drop(object oMstr)
{
object oItem = GetFirstItemInInventory(oMstr);
location oLoc = GetLocation(oMstr);
while(oItem != OBJECT_INVALID)//boucle...
{
//on cree l'item a l'endroit de la mort (possiblite pour un DelayCommdand
//si l'on ne veut pas que l'item apparaisse tout de suite)
CreateObject(GetObjectType(oItem), GetResRef(oItem), oLoc);
DestroyObject(oItem);
oItem = GetNextItemInInventory(oMstr);
}
}
void main()
{
//application de la fonction au monstre qui possede ce script
Drop(OBJECT_SELF);
//RESTE DU SCRIPT SUR LE OnDeath DU MONSTRE//
int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
{
object oKiller = GetLastKiller();
AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
}
SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);
//Shout Attack my target, only works with the On Spawn In setup
SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);
if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(1007));
}
}
L'utilisation est expliquée dans le header, en commentaires.
NB : Ici, les objets doivent être édités dans la palette (de la façon resref = "resref" et tag = "n_resref") car aurora ne permet pas d'éditer les items dans l'inventaire du monstre, comme pour les coffres.
Voilà