GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Showroom SA:MP => Discussion démarrée par: S!m le 29 Octobre 2009, 23:51:37

Titre: [FS] SuperStream v1.1
Posté par: S!m le 29 Octobre 2009, 23:51:37
[FS] SuperStream

Presentation
Salut à tous, je vous présente mon nouveau streamer, le SuperStream (que l'on peut surnommer SS).
Donc voila, le SS est une version faite par moi de A à Z, j'ai demander conseil à quelques personnes de mon entourage concernant l'optimisation et ai décidé de ne pas faire de système complexe, rendant le système plus simple à comprendre et donc modifier

Cible
Il a été testé avec 4 joueurs, ce streamer s'adresse aux serveurs moyen qui on un nombre de joueur moyen et une quantité d'objet normale, bref on oublie déjà les serveurs de 120 joueurs et 20 000 objets.

Fonctionnement
En gros, ce streamer vérifie si les objets sont à une distance maximale du joueur (afin d'ajuster cette distance, voir les #define en haut du script) puis choisi un nombre constant d'objets au joueurs, les plus près. Il permet ainsi d'être utilisé pour des maps comprenant une densité d'objets importante (tout comme SimStream). La différence principale réside dans la réduction du nombre d'options et la modification de la logique de certaines parties. Ce script est conçu pour sa-mp 0.3. Puisque certaines fonctionnalités ont été éliminées lors du passage 0.2X -> 0.3, j'ai pu simplifier grandement le streamer, par exemple les AttachPlayerObjectToPlayer n'existe plus, rayant ainsi cette fonctionnalité du streamer. L'algorithme du déplacement d'objet a été revu (simplifier).

Le streamer s'assure en tout temps de ne pas faire de calculs inutiles. Il comporte un test afin de réduire les calculs inutiles, il vérifie qu'un certains laps de temps c'est écoulé depuis le dernier calcul de position avant de le forcer via le timer. J'ai contourné le bug de GetTickCount sous linux en utilisant un timer afin de connaitre le temps écoulé depuis le lancement du serveur (de base, j'ai mis une précision de 25 millisecondes, mais vous pouvez changer cette valeur grâce aux #define en haut).

Méthodes d'appel au stream
Vous pouvez améliorer le rendu sur votre serveur en forcant le streamer à recalculer les positions. Vous n'avez qu'à include SuperStream.inc dans le script pour pouvoir appelée la fonction StreamPlayer qui recalcule le tout. Il est recommandé d'utiliser cette fonction (StreamPlayer) lors des téléports afin d'accélérer le chargement des objets.

Le streamer comprend également une fonction qui permet d'augmenter le délai du timer, il vérifie en tout temps (via la callback OnPlayerUpdate) que les joueurs ne s'approchent pas trop des extrémités de la zone comprenant des objets. Si jamais le joueur s'approche trop de la limite de cette zone, il force le calcul des objets.

Pourquoi toutes ces méthodes d'appel au stream?
Tout simplement pour permettre un meilleur rendu avec un nombre de calcul minimal. En appelant le streaming au moment nécessaires, on évite des calculs inutiles. Je trouve néanmoins que l'utilisation d'un timer permet un minimum de sécurité de chargement.

Quand devrait-on utiliser StreamPlayer?

Les utilisations pratique de cette fonction sont simple, n'importe quand où il y a un changement important concernant la position où les objets. Par exemple, si vous utilisez un système de rampes, il pourrait être interressant d'utiliser la fonction suite à la création de la rampe afin d'accélérer l'apparition de la rampe pour le joueur. Un autre usage, tel que mentionné ci-dessus, serait lors des téléportations. Je n'ai pas expérimenté de problème de chute lors du chargement de routes suite à un téléport sur mon propre serveur en utilisant correctement cette fonction.

Paramètres
Les paramètres sont tous situés entre la ligne 15 et la ligne 27 du script. Ils consistent en:

.

Installation:
Ce script doit normalement être placé tel quel dans votre dossier filterscript (ne pas oublier d'ajouter SuperStream dans votre server.cfg), vous pouvez changer les defines cités ci-dessus, mais si vous ne savez pas ce que vous faites, vous êtes mieux de ne pas aller plus loin.
Par la suite, pour ajouter de nouveaux objets vous utilisez un autre script (un fs quelconque ou votre gm) dans lequel vous ajouterez la ligne #include <SuperStream.inc>. Vous pourrez désormais utiliser les fonctions suivantes:
Citer
native CreateStreamObject(modelid,Float:X,Float:Y,Float:Z,Float:RX,Float:RY,Float:RZ) - Ajoute un nouvel objet
native DestroyStreamObject(objectid) - Enlève un objet complètement
native StreamPlayer(playerid, Float:X, Float:Y, Float:Z) - Force le streaming pour un joueur afin d'accélérer l'apparition des objets
native MoveStreamObject(objectid, Float:TargetX, Float:TargetY, Float:TargetZ, Float:Speed) - Déplace un objets vers les coordonnées TargetX, TargetY, TargetZ
native StopStreamObject(objectid) - Arrête le déplacement d'un objet
native ClearPlayerObjects(playerid) - enlève les objets pour un seul joueurs (peut permettre le respawn forcé de certains objets (pratique pour les barrils explosifs et autres))
native ClearAllObjects() - enlève tous les objets pour tous les joueurs (nettoie tout quoi)

Téléchargement:
Nouvelle version:
Solidfiles - v1.1.4 :
(http://solidfiles.com/info_imgs/Qn0C.jpg) (http://solidfiles.com/d/Qn0C)

Pastebin GtaOnline - v1.1.0
[FS] SuperStream.pwn (http://pastebin.gtaonline.fr/pastebin.php?show=704)
[INC] SuperStream.inc (http://pastebin.gtaonline.fr/pastebin.php?show=705)

Remerciements:
Tous à qui j'ai demandé des petits conseils.
Master-bru et xTig3rZx pour leur aide afin de tester.
Tout ceux que j'ai oublié.
Surtout tous les gens qui font de sa-mp et les communautés qui orbitent autour ce qu'elles sont.


Modifications:

V1.0 : sortie officiel du script

V1.1 : Correction d'un bug avec les MoveStreamObject et ajout de la callback OnStreamObjectMoved, légers ajustement du streaming, bug d'arrêt du fs sans raison apparente semble corrigé..
V1.1.1 : réglage d'un petit bug avec la distance de test pour OnPlayerUpdate
V1.1.2 : correction d'une constante (NO_TICK_COUNT)
V1.1.3 : correction d'un petit problème causé par délai d'update des position dans les données du serveur.
V1.1.4 : tentative de correction d'un bug avec les Interieur

Bugs/Oublis/Commentaires:
Aucun bug/oubli n'a été identifié pour le moment. Merci de le signaler sur ce fil de discussion si vous en trouvez. Les commentaires sont toujours les bienvenus.

ps. Pour ceux qui se demandent pourquoi ne pas avoir posté sur le fil de discussion de SimStream, ma réponse est simple: ce sont deux streamer, oui, mais les différences sont trop importantes pour être considérés comme un même script, ils ne s'adressent pas au même genre de clientèle.

++Sim++
Titre: Re : [FS] SuperStream v1.0
Posté par: Ssk le 29 Octobre 2009, 23:54:52
GG sim je regarderais ce code demain car la le 00h00 approche lol
Titre: Re : [FS] SuperStream v1.0
Posté par: BuBuNo le 30 Octobre 2009, 00:01:34
GG sim je l'attendais avec impassiance vue les teste que tu as fait dessus
Titre: Re : Re : [FS] SuperStream v1.0
Posté par: S!m le 30 Octobre 2009, 00:16:12
Salut,

GG sim je regarderais ce code demain car la le 00h00 approche lol
GG sim je l'attendais avec impassiance vue les teste que tu as fait dessus

merci à vous  deux,
si tu veut de meilleurs performances/résultats, je te conseille de bien lire ce que j'ai écrit,
je me suis forcé à donner beaucoup d'information pour que les gens s'en servent de façon efficace
Si vous avez besoin de clarification ou autres informations (j'ai peut-être oublié une section), n'hésitez pas à demander plus d'information

++Sim++
Titre: Re : [FS] SuperStream v1.0
Posté par: Ssk le 30 Octobre 2009, 11:45:48
Béh je trouve que c 'est assez precis =)

Merci a toi ^^
Titre: Re : [FS] SuperStream v1.0
Posté par: cristab le 30 Octobre 2009, 17:16:13
tres sympas GG
Titre: Re : [FS] SuperStream v1.0
Posté par: Ssk le 30 Octobre 2009, 18:45:42
J' ai vu le code et c 'est tres bien fait =)

Encore gg
Titre: Re : [FS] SuperStream v1.0
Posté par: BuBuNo le 31 Octobre 2009, 03:27:54
Heu sim je voudrais le mettre sur mon serveur masi le probleme c'est quel fonction que je doit utiliser createobjet ???
Titre: Re : [FS] SuperStream v1.0
Posté par: Ssk le 31 Octobre 2009, 11:01:05
core_CreateObject(model, Float:OX, Float:OY, Float:OZ, Float:ORX, Float:ORY, Float:ORZ)
Titre: Re : [FS] SuperStream v1.0
Posté par: Xoss le 31 Octobre 2009, 12:21:37
Super
(Mais pour le nom tu aurait plus choisir autre chose SS ça le fait pas  ;) )
Sinon encore une bonne invention de ta part :p
Titre: Re : [FS] SuperStream v1.0
Posté par: S!m le 31 Octobre 2009, 14:13:24
Salut,

pour utiliser, il fonctionne un peu comme SimStream, les objets sont dans un autre script, bref regarde les fonctions de l'include, elles devraient être claires

ps.
Citation de: SuperStream - Include
native CreateStreamObject(modelid,Float:X,Float:Y,Float:Z,Float:RX,Float:RY,Float:RZ) - Ajoute un nouvel objet
native DestroyStreamObject(objectid) - Enlève un objet complètement
native StreamPlayer(playerid, Float:X, Float:Y, Float:Z) - Force le streaming pour un joueur afin d'accélérer l'apparition des objets
native MoveStreamObject(objectid, Float:TargetX, Float:TargetY, Float:TargetZ, Float:Speed) - Déplace un objets vers les coordonnées TargetX, TargetY, TargetZ
native StopStreamObject(objectid) - Arrête le déplacement d'un objet
native ClearPlayerObjects(playerid) - enlève les objets pour un seul joueurs (peut permettre le respawn forcé de certains objets (pratique pour les barrils explosifs et autres))
native ClearAllObjects() - enlève tous les objets pour tous les joueurs (nettoie tout quoi)

EDIT: juste pour être sûr, normalement,!!rien ne devrait être modifié dans le fs sauf les #define cité dans le premier post!! vous utilisez un autre fs ou votre gm pour ajoutez les objets etc....
EDIT2: ajout d'une petite section concernant l'installation

++Sim++
Titre: Re : [FS] SuperStream v1.0
Posté par: BuBuNo le 03 Novembre 2009, 21:28:11
Bon voila j'ai mis le FS et j'ai remarquer un truc assez etrange :

Avant :
CreateStreamObject(1634, -2246.421631, -1616.940918, 490.416199, 18.0482, 0.0000, 45.8594, 500);
Apres :
CreateStreamObject(1634, -2246.421631, -1616.940918, 490.416199, 18.0482, 0.0000, 45.8594);
Donc comme vous l'avez remaquer avant il y a a la fin  ",500" chose que apres non !
Donc quel compilateur devons nous utiliser pour que sa soit parfait car avant j'utilisait MidoStream ?

Merci d'avance
Titre: Re : [FS] SuperStream v1.0
Posté par: S!m le 04 Novembre 2009, 00:30:05
Salut,

tu dois enlever la distance (le 500)
avec SimStream tu n'étais pas obligé de mettre la distance, elle était prise en compte seulement dans un mode du streamer (qui pouvait calculer de différentes façon les objets à montrer)
puisque la méthode utilisée ici ne comporte pas le moindre intérêt à demander une distance de vue des objets, je n'en ai pas mis...

ps. il y aura bientôt une petite mise à jour, j'ai remarqué que je n'avais pas tout à fait complété la partie de déplacement d'objets (MoveStreamObject)

++Sim++
Titre: Re : [FS] SuperStream v1.0
Posté par: BuBuNo le 02 Décembre 2009, 21:35:37
Bon apres l'avoir tester asser lomptemp j'ai pu remarquer un bug :P

Enfaite je croit que il ne cree pas tout les objets car sur mon serveur j'ai environ 3000 objets et puis il n'aparaisse pas tous!

Titre: Re : [FS] SuperStream v1.0
Posté par: S!m le 03 Décembre 2009, 15:47:39
Salut,

as-tu ajuster la limite d'objets à tes besoins?

si oui, j'aimerais bien savoir ce que tu veut dire par "ils n'apparaissent pas tous", par vague on ne les voient plus ou simplement certains objets sont toujours absents....

++Sim++
Titre: Re : [FS] SuperStream v1.1
Posté par: TheAlex86 le 07 Décembre 2009, 01:53:41
super avec ta 1.1 c'est le pied intégral merci !
Titre: Re : Re : [FS] SuperStream v1.1
Posté par: S!m le 07 Décembre 2009, 02:29:15
super avec ta 1.1 c'est le pied intégral merci !

désolé, je n'ai pas compris  sens de ta phrase (eh oui,  ne suis pas français d'origine)

si tu veut dire que ça fonctionne bien: merci du commentaire
si tu veut plutôt dire que ça ne marche pas (sarcasmes): merci du commentaire pareil, mais explique ton problème et je ferai ce que je pourrai

++Sim++
Titre: Re : [FS] SuperStream v1.1
Posté par: Xoss le 07 Décembre 2009, 07:26:40
Je pense qu'il veut dire que c'est bien  :)
Titre: Re : [FS] SuperStream v1.1
Posté par: cristab le 07 Décembre 2009, 09:10:37
oui il dit avec la version 1.1 c'est super pas de bug apparent
Titre: Re : [FS] SuperStream v1.1
Posté par: TheAlex86 le 09 Décembre 2009, 17:57:49
Citer
bug d'arrêt du fs sans raison apparente semble corrigé..
non moi ça me le fait toujours.

plus rarement mais la ça vien de me le faire.
Titre: Re : Re : [FS] SuperStream v1.1
Posté par: S!m le 09 Décembre 2009, 18:04:15
salut,

Citer
bug d'arrêt du fs sans raison apparente semble corrigé..
non moi ça me le fait toujours.

plus rarement mais la ça vien de me le faire.
hum, je ne sais pas vraiment quoi te dire, j'ignore toujours d'où vient ce problème, si t'as la moindre idée fais moi s'en part stp, je vais regarder ça quand j'aurai fini mes examens

++Sim++
Titre: Re : [FS] SuperStream v1.1
Posté par: S!m le 23 Février 2010, 22:59:56
Salut,

désolé pour le double post mais je ne fais que signaler la sortie de la v1.1.4 qui corrige ce qui semble être un bug avec les objets au moment d'un changement d'intérieur (genre entrer dans une maison ou un biz)

++Sim++
Titre: Re : Re : [FS] SuperStream v1.1
Posté par: scott1 le 24 Février 2010, 14:13:57
Salut,

désolé pour le double post mais je ne fais que signaler la sortie de la v1.1.4 qui corrige ce qui semble être un bug avec les objets au moment d'un changement d'intérieur (genre entrer dans une maison ou un biz)

++Sim++

Excusé pour 2mois d'interval ^^
Titre: Re : [FS] SuperStream v1.1
Posté par: skylive77 le 23 Juin 2010, 19:46:29
J'ai ajouté le streamer sans problème, mais quand je vais sur mon Serveur, et quand j'utilise la commande :

//--------------------------------=[Roadblock]=-----------------------------------
// by Luk0r
if(strcmp(cmdtext, "/poserbarrage", true)==0 || strcmp(cmdtext, "/pb", true)==0)
{
if (PlayerInfo[playerid][pMember] == 1 && PlayerInfo[playerid][pLeader] == 1 || PlayerInfo[playerid][pMember] == 2 && PlayerInfo[playerid][pLeader] == 2 || PlayerInfo[playerid][pMember] == 3 && PlayerInfo[playerid][pLeader] == 3) return SendClientMessage(playerid, COLOR_GREY, "Vous n'êtes pas flic / Membre du FBI / Militaire !");
if (PlayerInfo[playerid][pRoadblock] != 0) return SendClientMessage(playerid, COLOR_GREY, "Vous ne pouvez pas déployer un autre barrage , tapez /rb pour supprimer votre barrage existant.");
if (roadblocktimer != 0) return SendClientMessage(playerid, COLOR_GREY, "Veulliez attendre avant de placer un autre barrage!");
new Float:X, Float:Y, Float:Z, Float:A;
GetPlayerPos(playerid, X, Y, Z);
GetPlayerFacingAngle(playerid, A);
PlayerInfo[playerid][pRoadblock] = CreateObject(981, X, Y, Z, 0.0, 0.0, A+180);
SetPlayerPos(playerid, X, Y, Z+4);
GameTextForPlayer(playerid, "~w~Barrage ~r~Deploye", 5000, 5);
SendClientMessage(playerid, COLOR_GREEN, "Déployement du barrage, tapez /rb ou /retirerbarrage pour le suprimé.");
roadblocktimer = 1;
GetPlayerName(playerid, sendername, sizeof(sendername));
format(string, sizeof(string), "HQ: Un barrage routier à été déployé par %s, ce barrage à été marqué sur la carte.", sendername);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(PlayerInfo[i][pMember] == 1 || PlayerInfo[i][pLeader] == 1 || PlayerInfo[i][pMember] == 2 || PlayerInfo[i][pLeader] == 2 || PlayerInfo[i][pMember] == 3 || PlayerInfo[i][pLeader] == 3)
{
SetPlayerCheckpoint(playerid, X, Y, Z-10, 1.0);
SendClientMessage(i, TEAM_BLUE_COLOR, string);
if (PlayerInfo[i][pRank] >= 5 && PlayerInfo[i][pMember] || PlayerInfo[i][pLeader] == 1 || PlayerInfo[i][pRank] >= 5 && PlayerInfo[i][pMember] || PlayerInfo[i][pLeader] == 2 || PlayerInfo[i][pRank] >= 5 && PlayerInfo[i][pMember] || PlayerInfo[i][pLeader] == 3)
{
SendClientMessage(i, COLOR_YELLOW, "Vous pouvez supprimer tous les barrages routiers en tapant /rball");
}
}
}
}
SetTimer("ResetRoadblockTimer", 60000, false);
return 1;
}

Le barrage n'apparait pas

j'ai pourtant ajouté les defines (pour les paresseux)
Titre: Re : [FS] SuperStream v1.1
Posté par: S!m le 24 Juin 2010, 00:58:35
Salut,

es-ce que les autres objets (si autres objets il y a) apparaissent?
Serait-il possible que le barrage soit détruit ailleurs de façon presque instantanée?
Tu as bien lancer le fs et ajouté l'include? (désolé de descendre à ces questions mais bon...)

++Sim++
Titre: Re : [FS] SuperStream v1.1
Posté par: skylive77 le 24 Juin 2010, 01:03:32
Réglé, mais merci quand meme

La soluce :

Remplacé :
CreateObject(981, X, Y, Z, 0.0, 0.0, A+180);Par :
CreateStreamObject(981, X, Y, Z, 0.0, 0.0, A+180);
Et pareil pour la destruction du barrage avec : DestroyStreamObject

Faut croire que le Define à fait une exception. 
Titre: Re : [FS] SuperStream v1.1
Posté par: skylive77 le 28 Juin 2010, 00:59:53
Désolé du double post, mais j'ai d'autre soucis et questions

Soucis :

_ Lorsque je rentre dans l'hôpital, mon perso tombe dans le vide avant que le décor est fini de chargé.


Questions :

_ es ce possible de réduire le temps de chargement des objets ?
_ Si oui quelle à quel ligne ?
_ Ce streamer peut géré combien d'objet maximum (environs) ?

Je pense que c'est tout

Titre: Re : [FS] SuperStream v1.1
Posté par: S!m le 28 Juin 2010, 01:40:36
Salut,

je vais essayer de répondre clairement:

1. Oui c'est possible, utilise StreamPlayer (si me mémoire est bonne), se référer au premier post
2. premier post...
3. Il est paramétré à 5 000, mais j'ai déjà testé 20 000 (attention, j'étais seul). Le mieux c'est de voir toi même. Si tu remarque un ralentissement ou un usage trop important de ton CPU tu sais que ce n'est plus le streamer qu'il te faut. L'idéal reste un streamer semblable avec des zones en plugin (serait encore mieux intégré à sa-mp, mais faut pas rêver).

bonne chance ;)

++Sim++
Titre: Re : [FS] SuperStream v1.1
Posté par: vitry_selkato le 05 Juin 2011, 23:34:55
Merci, Ton Fs + Include ma permis de résoudre mon probléme .