Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

pouvoir un peu special

Par Iridian le 16/11/2002 à 16:04:01 (#2575432)

Toujours dans le cadre de l'utilisation d'un pouvoir spécial d'un objet, je voudrais que celui ci soigne quelques points de vie a intervalles réguliers.
Un peu comme un sort de régénération mais en beaucoup moins puissant (genre 1-3 pv tous les 3-4 round).
En plus, pour ne pas faire simple, je voudrais que ce pouvoir ne soit activable que lorsque le PC possède 2 objets (objet A : le déclencheur, objet B : un catalyseur).

Je sais déjà qu'il me faudra utiliser le onActivateItem du module, j'y placerai le script de condition qui teste la présence des 2 objets.

Par contre pour répéter l'effet a intervalles réguliers, je ne sais pas comment m'y prendre.
J'ai pensé a une variable testé dans le onHeartBeat du PC mais :
-Je ne sais pas comment l'y mettre
-J'ai peur que ça bouffe trop de ressources (j'ai 4-5 objets qui fonctionnerons sur ce principe).

Les questions :
-y a t'il un autre moyen de faire ce genre de chose ?
-si j'applique ma méthode, es-ce viable au niveau ressources ?
-avez-vous des conseils a me donner ?

Merci d'avance

Par LeProctophantasmiste le 16/11/2002 à 16:30:18 (#2575538)


onHeartBeat du PC

Ben surtout les PJs n'ont pas de OnHeartBeat, le seul moyen donc c'est via des appels récursifs (i.e: un script ou une fonction qui s'appelle soi-même, par ExecuteScript dans le cas du script, à intervalle régulier). Franchement tu va avoir du mal à faire un truc très propre... Qu'en est-il quand le PJ n'a plus l'objet sur lui...

Par Frolo Xeres le 16/11/2002 à 18:18:27 (#2576119)

Vient du message du Le Procto
des appels recursifs


Si tu veux lui bouffer ses ressources je pense qu'y a pas pire... Surtout sur plusieurs minutes...
Un empilement toute les milisecondes ou presque et en deux secondes, tu flambes tes 256 Mo de RAM !
N'est-il pas possible de poser une variable avec le nom du PC qui détiens l'objet sur le module - Avec un SetLocalInt sur onAcqiredObject et onUnacqiredObject. Un userDefined qui se lance toutes les x secondes si la variable est value... Parcours des PC pour trouver celui qui a le nom concerné... Et ApplyEffectOnObject( EFFECT_HEAL ) ou du genre ?

C'est juste une suggestion et les noms de fonctions sont pas exacts ni les parametres !

Par Jedaï le 16/11/2002 à 21:45:51 (#2577130)

Voui, c'est possible, c'est même très faisable (même si la solution récursive, avec un DelayCommand(18.0, ExecuteScript("LeScriptQuiVaBien", oPC)); marcherai probablement pas si mal...:) ) :



//A mettre sur le OnActivateItem

void main()
{
object oItem = GetItemActivated();
object oPC = GetItemActivator();

if (GetTag(oItem) == "Tag_De_L_Objet_Activateur")
{
if (GetIsObjectValid(GetItemPossessedBy(oPC, "Tag_Du_2e_objet"))
&& GetIsObjectValid(GetItemPossessedBy(oPC, "Tag_Du_3e_objet")))
{
effect eRegen = EffectRegenerate(2, 18.0);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eRegen, oPC);
}
}
}



//A mettre sur le OnUnAcquiredItem

void StopRegenProcess(object oPJ)
{
effect e = GetFirstEffect(oPJ);

while (GetIsEffectValid(e))
{
if (GetEffectType(e) == EFFECT_TYPE_REGENERATE)
RemoveEffect(oPJ, e);

e = GetNextEffect(oPJ);
}
}

void main()
{
object oItem = GetModuleItemLost();
object oPC = GetModuleItemLostBy();

if (GetIsPC(oPC))
{

//perte du 1er objet ?
if (GetTag(oItem) == "Tag_Du_1er_objet")
{
if (GetIsObjectValid(GetItemPossessedBy(oPC, "Tag_Du_2e_objet"))
&& GetIsObjectValid(GetItemPossessedBy(oPC, "Tag_Du_3e_objet")))
{
StopRegenProcess(oPC);
}
}
//perte du 2e objet ?
else if (GetTag(oItem) == "Tag_Du_2e_objet")
{
if (GetIsObjectValid(GetItemPossessedBy(oPC, "Tag_Du_1er_objet"))
&& GetIsObjectValid(GetItemPossessedBy(oPC, "Tag_Du_3e_objet")))
{
StopRegenProcess(oPC);
}
}
//perte du 3e objet ?
else if (GetTag(oItem) == "Tag_Du_3e_objet")
{
if (GetIsObjectValid(GetItemPossessedBy(oPC, "Tag_Du_1er_objet"))
&& GetIsObjectValid(GetItemPossessedBy(oPC, "Tag_Du_2e_objet")))
{
StopRegenProcess(oPC);
}
}

}
}


Voilà, c'est assez imprécis mais bon....ça devrait marcher !:cool:

Par Iridian le 16/11/2002 à 23:16:50 (#2577419)

Merci Jedi, je vais appliquer ta solution mais sans le onUnAcquiredItem, a la place je vais donner une durée de 5 minutes a l'effet et utiliser les dès pour le nombre de points de vie régénéré. Et accessoirement ne declancher l'effet que si les 2 objets sont present et equipé.

Encore merci, petit a petit grace a vous tous je progresse !

JOL Archives 1.0.1
@ JOL / JeuxOnLine