Bonjour à tous.
C'est à propos d'un script sur les liens permanents.
Voila tout ce que je vais dire se rapporte à un topic aujourd'hui fermé, concernant un remplacement des OnHearthBeat par un systeme de script. Les HearthBeat ne sont activés que lorsque un PJ se trouve effectivement dans la zone. Cela permet de soulager la charge CPU.
Un fabuleux script d'
Azrael07
, mais qui apparemment a été controversé
Voici le lien :
https://forums.jeuxonline.info/showthread.php?t=127623
Mais je suis pas très futé desfois

, et j'ai donc un petit probleme à comprendre tout ça

. Et pis avec tout le blabla et les modifications ont ini par s'y perdre un peu.
Un petit résumé pour savoir si je comprend bien :
J'ai mis des noms arbitraires (ceux que moi j'ai mis quoi) aux scripts, car je crois que les noms sont important pour que ça marche (enfin si j'ai bien compris)
1. Sur le On Enter de la Zone concerné : g_hearthbeat
2. Sur le On Exit de la Zone Concerné : g_hearhbeat1
Là se sont deux scripts généralistes qu'il faut juste bien placer.
g_hearthbeat :
//OnHeartBeat emulator
//Created by Azrael
//File for OnEnter of area
void OnHeartBeat();
void main()
{
int nPlayerInArea = GetLocalInt(OBJECT_SELF, "nbrPC");//On recupere l'integer qui sauvegarde le nombre de joueurs dans l'area
nPlayerInArea++;//On incremente la valeur
if (nPlayerInArea == 1) DelayCommand(6.0f, OnHeartBeat());//On active le script qui definira l'action
SetLocalInt(OBJECT_SELF,"nbrPC", nPlayerInArea);//Et on l'archive de nouveau
}
void OnHeartBeat()
{
if( GetLocalInt(OBJECT_SELF, "nbrPC") )
{
//code
}
else return;
DelayCommand(6.0f, OnHeartBeat());//On active le script qui definira l'action
}
g_heartbeat1
//Dans le On Exit
//OnHeartBeat emulator
//Created by Azrael
//File for OnExit of area
void main()
{
int nPlayerInArea = GetLocalInt(OBJECT_SELF, "nbrPC");//On recupere l'integer qui sauvegarde le nombre de joueurs dans l'area
nPlayerInArea--;//On reduit la valeur
SetLocalInt(OBJECT_SELF,"nbrPC", nPlayerInArea);//Et on l'archive de nouveau
}
3. Rajouter la ligne g_hearthbeat3 dans le OnModuleLoad du module. Dans g_hearthbeat3 il faut changer les noms des zones concerné par ce script. On rajoute cette petite ligne autant de fois qu’il y a de zones qui utiliseront ce systeme de Heartbeat.
g_heartbeat3 (là on s'en fout completement du nom)
SetLocalInt(GetObjectByTag("TAGAREA"),"iPlayerInAreaTAGAREA",0);
//Ca correspond a une variable qui donne le nombre de joueur actuelement dans l'area conserné.
4. Enfin, et c'est là je crois que je me trompe, le script g_heartbeat2 est un script d’appel à ne placer nulle part.
g_heartbeat2
//New script called by OnEnter of area
//Le nombre de joueurs dans l'area, indispensable pour pouvoir tout arreter si y'en a plus
int iPlayerInArea = GetLocalInt(OBJECT_SELF,"iPlayerInAreaTAGAREA");
int iSecond;//Pour retenir la seconde (voir + loin)
int iNextAction = GetTimeSecond();//La prochaine action realisee
void main()
{
while(iPlayerInArea > 0)//S'il n'y a plus de joueurs la boucle se termine
{
//On retient la seconde actuelle pour :
// 1.Ne pas surcharger en appelant tjrs le temp par la fct
// 2.Etre sur qu'on ne change pas de secondes entre deux lignes de codes (tres peu probable mais possible)
iSecond = GetTimeSecond();
//Si il y a eut 6 secondes depuis la derniere action...
if (iNextAction >= iSecond)
{
//...On reinitialise la variable du temp pour la prochaines action
//En revenant a zero si le temp a depasse 54(prochaine action dans 6s : 54+6 = 60, c a dire hors de l'echelle des secondes
if (iSecond >= 54)
{
iNextAction = iSecond - 54;
}
else
{
iNextAction = GetTimeSecond() + 6;
}
//Ici on a reproduit un OnHeartBeat qui ne se produit que si des joueurs sont dans l'area.
//Vous pouvez donc mettre ici votre code comme normal
//Si vous faites un ExecuteScript vous pouvez meme cibler un autre objet
}
//On update le nombre de joueurs present dans l'area
iPlayerInArea = GetLocalInt(OBJECT_SELF,"iPlayerInAreaTAGAREA");
}
}
Bon ce qui n'est pas clair dans ma tête, c'est de savoir ce qu'il faut changer dans les scripts :
Dans g_hearthbeat3, TAGAREA = tag de la zone TAGAREA et iPlayerInAreaTAGAREA = c'est une variable, et sert à calcule le nombre de PJ dans la zone concerné. Sa suppose que TAGAREA coresponde quand même au Tag de la zone. Pareil pour g_heartbeat2. Donc g_heartbeat2 devra être édités autant de fois qu'il y a de zones concernés. Donc je pourrais l'appeler ici par exemple sc_heart_tagarea.
Mais après il faut que je fasse quoi exactement. J'utilise un # Include ? Ou rien du tout c'est bien comme ça ?
Arf j'ai essayé d'être le plus clair possible, pour expliquer ce que j'ai pas compris

. Désolé si mes questions parraissent pour les confirmés vraiment trop simple, mais dans ce cas je veux bien passer pour bête si quelqu'un veux bien m'expliquer un peu tout ça
Merci bien

. @ +