Script qui remplace le OnHearthBeat [de Azrael07]

Répondre
Partager Rechercher
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 :

Code PHP:

//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 == 1DelayCommand(6.0fOnHeartBeat());//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.0fOnHeartBeat());//On active le script qui definira l'action


g_heartbeat1

Code PHP:

//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)

Code PHP:

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

Code PHP:

//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
. @ +
Il me semblait qu'au chargement du module, la création des PNJ dans les zones enclenchaient leur onEnter, non ?
Si c'est le cas il suffirait qu'il y ai un PNJ dans la zone pour lancer le script :-/

Mais il y a un truc qui me perturbe, dans le onEnter il y a ceci :
Code PHP:

if (nPlayerInArea == 1DelayCommand(6.0fOnHeartBeat());//On active le script qui definira l'action 

Ne serait-ce pas ceci plutôt qu'il faudrait mettre ? :
Code PHP:

if (nPlayerInArea 0DelayCommand(6.0fOnHeartBeat());//On active le script qui definira l'action 

Le premier marche très bien pour des campagnes solo mais dès qu'il y en a plus

Enfin dites moi si je me trompe pour le Load du module...
Non non tu as tout à fait raison, les PNJs déclenchent un évènement OnEnter pour la zone où ils ont été placés.

Si ça ne tenait qu'à moi, je ferais simplement en sorte que le script placé sur le OnHeartBeat ne s'exécute pas (deux lignes au début du script). La différence de performance variera entre le minime et l'imperceptible, et de toutes façons tu y gagneras en simplicité de code.

Fait comme tu veux
Vous prenez pas la tête, dans quelques jours je publie un système 30x plus puissant qu'est celui de la gestion d'evenements temporaires

Reste juste un peu de débuggage a faire et un petit tut pour l'utiliser et ce sera pret
Bon j'ai enfin compris grâce à Jedaï

Je me compliquais vraiment la vie pour rien moi^^

Y'a besoin que de 2 scripts en fait.

Bon Jedaï en a profiter pour optimiser encore plus ces deux scripts. je vous en fait profiter :

Sur le On enter
Code PHP:

//OnHeartBeat emulator 
//Created by Azrael 
//File for OnEnter of area 

void OnHeartBeat(); 

void main() 

    
    if( 
GetIsPCGetEnteringObject() ) )
{        
        
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 == 1DelayCommand(6.0fOnHeartBeat());//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 de ton OnHeartBeat 
    

    else return; 

    
DelayCommand(6.0fOnHeartBeat());//On active le script qui definira l'action 


Sur le On Exit :
Code PHP:

//Dans le On Exit 
//OnHeartBeat emulator 
//Created by Azrael 
//File for OnExit of area 

void main() 

    
    if( 
GetIsPCGetLeavingObject() ))
 { 
        
SetLocalInt(OBJECT_SELF,"nbrPC"GetLocalInt(OBJECT_SELF"nbrPC") - 1); 
    } 

Voili voila et que la simplicité règne sur cette terre sauvage des scripts
Répondre

Connectés sur ce fil

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