[Résolu] [DB-AL] (photon) Je comprends mal les RPC de photon

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

[Résolu] [DB-AL] (photon) Je comprends mal les RPC de photon

Message par Autodidactelife » 27 Nov 2018 12:09

Bonjour a tous, ayant un anglais épouvantable je n'ai pas eu de réponse sur le forum photon alors j'espère qu'il y des utilisateurs de photon ici :aille2:

En faite je n'arrive pas a comprendre comment les RPC de photon sont sécurisé pour moi logiquement vu que tout est coter client alors rien n'est sécurisé j'ai chercher des tutoriel vidéo avec code mais pour moi une personne qui bidouille le code ce génère ce qu'il veut !

Je vais vous présentés 2 soucis que je rencontres avec photon mais je penses que c'est moi qui n'est pas compris car sinon personne utiliserait photon.

1)Je veux faire un personnage ayant un équipement et un inventaire.

Lors de la connexion du joueur il reçoit le data qui contient tout. Problème ! Même si je ne charge pas l'inventaire a la connexion du joueur (pour les autres) n'importe quel personne qui change le code et récupère l'inventaire peut savoir l'inventaire ! Du moins d'après ce que j'ai compris en lisant la logique du code.

2) J'aimerais placé un coffre, ce coffre contient des équipements soit généré a son spawn sois a l'ouverture.

Si il est déjà pré généré les joueurs peuvent avoir son contenu sans l'ouvrir et si je le génère a l'ouverture le client l'ouvrant pourra généré les items qu'il veut.

Donc on est d'accord je n'ai pas compris quelque chose ?

Merci pour votre aide ! J'ai du mal avec les longues explications en anglais je manque de temps pour faire des tests et mes précédents test je n'ai même pas réussis a changer niveau globale quoi que ce sois :-|

J'aimerais surtout savoir si j'ai bien compris photon ou non. Sur UNET c'est simple de gérer serveur ou client mais le gros défaut du faite qu'on ne puisse pas refusé les connexions avant la synchro est pour moi trop important pour l'utiliser. (Pas de white liste possible ni rien ... Pas assez souple)
Dernière édition par Autodidactelife le 27 Nov 2018 20:44, édité 1 fois.

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: [DB-AL] (photon) Je comprend mal mes RPC de photon

Message par Farstone » 27 Nov 2018 19:10

Salut ! C'est marrant car je suis passé exactement par là à mes début en networking, à vouloir faire un battle royal avec Photon :mdr3:

Honnêtement pour ce qui est de "Photon Cloud" je ne vais pas m'éterniser la dessus car comme tu la compris, il est surtout fait pour des jeux sans réel profondeur en terme de sauvegarde et de sécurité pour la simple est bonne raison que c'est Photon qui héberge les serveurs sur leur cloud, néanmoins il est quand même possible d'arriver à quelque chose en utilisant Photon Server qui te permet de coder et d’héberger ton propre serveur mais j'y reviendrais à la fin du post.

Ce que tu veux faire est beaucoup plus complexe qu'il n'y parait niveau networking pour avoir un résultat sécurisé et propre, déjà il faut bien se rappeler qu'on ne fait jamais confiance au client dans se genre de situation, ce qui est très difficile voir impossible en utilisant PUN puisque tu n'a pas accès à la logique du serveur.
Dans ton cas tu doit te tourner vers une solution "authoritative", ce qui veux dire que chaque action que fait un client est d'abord validé par un serveur et que tout les clients ne reçoivent qu'une représentation 3D/2D du serveur, et en aucun cas celle d'un autre client.
Le serveur est la seul source de confiance dans toute la logique, c'est lui qui gère et stock toutes les données sensible du jeu comme les inventaires, les positions, les droits, les pseudo... des clients.

Pour te donner un exemple, imaginons qu'un joueur se connecte au serveur, en récupérant une ID unique et sécurisé, le serveur est capable de retrouver les données spécifique à cette ID dans son stockage (une BDD MySQL ou SqlLite par exemple), il peux ainsi déterminer si le joueur a déjà joué sur se serveur et si il possède un inventaire et autres données utile que tu aurais sauvegarder, il peux maintenant récupérer c'est données et les envoyer au client, à se stade le client reçoit une réponse du serveur avec son inventaire que tu affiche comme tu veux.

Maintenant imaginons que le client décide de modifier son code source pour se spawner des items dans son inventaire, en créant une logique sur le serveur tu peux facilement faire un système de vérification, c'est un peu compliqué à expliquer car c'est à toi de décider ou mettre cette vérification, ça peux être basé sur le temps ou tout simplement au moment ou l'utilisateur switch d'objet dans sa ceinture / utilise l'objet, tu constateras immédiatement sur ton serveur que le client ne possède pas cette objet :nonon: Comme tout les clients reçoivent une représentation du serveur et que toutes les actions transite par lui, tu peux refuser l'action en question pour qu'elle ne soit pas retransmise au autres clients, ainsi le mal est écarté :super:
Le problème c'est que le client malicieux est fourbe :perv: il ne va pas juste se faire spawn un item bêtement dans son inventaire, à la place il va faire croire au serveur qu'il ramasse un objet bien réel sur la map, ou qu'il ouvre un coffre au quel il n'a pas accès physiquement, comme il n'y a pas de protection, le serveur lui fait confiance et lui permet l'accès au items, la encore c'est à toi de coder un système de protection en utilisant les données du serveur (la position), certains jeu utilise simplement une comparaison de distance entre l'item/le coffre et le client pour savoir si effectivement il se trouve à coter (ça fonctionne bien mais on peux ramasser les objet à travers les murs).

Je ne vais pas te faire tout les cas de figure, le but était surtout de te faire comprendre qu'un problème résolu en cache souvent un autre et que c'est de cette manière qu'on fait un bon jeux multi sécurisé, on a une source de confiance et on mise tout dessus pour faire la sécurité du jeu du mieux qu'on le peux :-D
Tu va voir au début c'est un peu compliqué mais quand on a compris le fonctionnement du système authoritative ça va tout seul, pour ce qui est de l'anglais ça viens avec le temps je suppose.

Maintenant quel solution de networking utiliser ?
Et bien une qui te permet de gérer le code de ton serveur, de la bibliothèque socket low-level comme LiteNetLib a la solution plus facile comme Forge Networking, à toi de faire ton choix selon t'es compétences et ta motivation.

Ensuite pour en revenir a Photon Server, je te le déconseille pour la simple et bonne raison que je ne voie pas l’utilité de payer pour coder son propre serveur presque de 0 mais ce n'est que mon avis et je ne prétend pas connaitre toutes les fonctionnalités qu'offre Photon Server.

Bref j'espère que tu comprend mieux le fonctionnement et l’intérêt du patern authoritative et je te souhaite bonne chance pour la suite, n'hésite pas si tu à d'autres questions :hello:

EDIT : Pavé césar

Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

Re: [DB-AL] (photon) Je comprend mal mes RPC de photon

Message par Autodidactelife » 27 Nov 2018 20:43

Oooh une réponse ! :amen:
Comme on ce retrouve Twiixy ! Héhé ! Je te remercie d'abord pour ton message :)

Je vais essayer de pas faire des pavés MOI (je te taquines !)

Alors presque mais je ne comptes pas faire de jeu de guerre mais plutôt de gestion ! ;)
Ensuite tu m'avais aider sur des sujets sur UNET mais saches que depuis je me sentais tellement un boulet pour le forum et tellement perdu que j'ai stop d'utiliser UNET, j'ai fermer ma société, j'ai continuer ma vie jusqu'à maintenant où je reviens en tant que passionner. (Et je déconnes pas quand je dis j'ai fermer ma société, je ne suis plus auto entrepreneur).

Ce passage de serveur "authoritative" sur UNET m'a bloquer et j'étais complètement perdu.
Dès qu'un client ce co il reçoit tout, il est synchronisé je ne comprends pas pourquoi un tel choix alors que le but primaire d'unity c'est d'avoir le choix et de tout faire comme on le veut. Il me semble que UNET va disparaître et pour le moment il est conseiller d'utiliser Photon.

Alors ... Je vais sur photon ! Et oui pour tout ce qui est 100% confiance au serveur pas aux clients je sais bien pour ça, d'où le faite que je viennes, avant même mes 1er test j'ai regarder plusieurs tutoriels sur internet et je vois des failles de partout je me suis dis sois il y à un truc que je n'ai pas compris, sois c'est pas ce que je cherche du tout.

Bon je penses que la seule et dernière solution la plus simple sera ... De faire mon propre serveur en socket du début à la fin ... Car UNET il n'y à qu'un tout petit défaut c'est vraiment dommage, un serveur UNET avec l'authentification de Photon ça aurait était juste parfait. Je trouves ça vraiment nul de faire quelque chose pour créer des jeux en ayant des points faibles énorme sur le mulitjoueur. En faite on part sur des jeux avec sois multijoueur simpliste et rapide (remplie de failles, car au fond même un jeu de tir on serait pas capable de faire en sorte qu'un tricheur tir pas rapidement ...) et UNET qui synchronise tout sans même avoir le temps de réagir :(

Et bien je pense faire petit à petit tout les jours quand l'envie me prend un jour j'aurais peut être un serveur fonctionnelle !
Mais ça me prendra beaucoup plus de temps que prévu, le but de coder seul c'est de coder avec une base pré construite mais bon.

Je vais essayer de partager les "bases" et les fonctions spécialement faite pour le jeu dans le but d'avoir un moule réutilisable.

Merci encore Twiixy, je vais définitivement abandonner UNET et Photon (Photon à 100%, Unet c'est à voir selon le projet).
Il y à aussi Smart Fox Serveur à priori utilisable en C# et ce n'est pas sous Unity c'est similaire à photon avec des systèmes de room et tout ça, mais personnellement leurs serveurs ça me fait pleins d'erreur impossible de lancer 2/3 des serveurs disponible et j'ai eu un truc aussi avec le 3eme.

Décidément les serveurs me détestes ...

Merci encore Twiixy, tu es super et tu aides tellement ici ! :)
Bon courage et bonne programmation à toi ;) :coeur: :coeur: :coeur:

Edit: En gros faut imaginer que j'ai énormément de bases, mais certains points important il y à un gros cratère, j'ai malheureusement pas tout appris ce qu'il faut. Cependant je serais capable de faire un serveur en socket en même asynchrone ! Mais je doutes tellement car à chaque fois que j'essayes de faire des logiciels ou quoi je trouves que ça fonctionne toujours plus mal que ceux des autres.

Pourtant je suis du genre à toujours aimer à faire moi même pour que ce sois parfait. Mais là ... C'est autre chose :triste1:

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: [Résolu] [DB-AL] (photon) Je comprends mal les RPC de photon

Message par Farstone » 27 Nov 2018 22:24

A mon avis tu devrais prendre une bibliothèque high level quand même mais qui te laisse gérer ton serveur, renseigne toi sur Forge Networking, c'est un ancien asset payant devenue gratuit et tu à accès au sources, il y en a d'autres c'est qu'un avis mais il me semble que c'est la plus complète des solutions gratuite, faut vraiment s'accrocher pour le low level, et avoir un bon anglais pour lire les doc.

Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

Re: [Résolu] [DB-AL] (photon) Je comprends mal les RPC de photon

Message par Autodidactelife » 29 Nov 2018 22:01

Depuis plusieurs heures j'ai programmer un serveur TCP avec un Client sur Unity ...

Donc j'ai programmer une connexion du client, là le serveur vérifie si l'ip est dans la blacklist (base MYSQL) ...
Si c'est bon il l'accepte, là une fois accepter le client envoie les identifiants ...
Le serveur vérifie si il existe et si c'est le même mot de passe, si oui il envoie un JSON contenant toutes les infos du personnage, sinon il envoie un message de kick (puis par sécurité il ferme la connexion).

Je n'en suis que là et j'ai prévu tout une suite mais ... Impossible d'instantiate un joueur ou de modifier un canvas Text ni rien dans les fonctions TCP, je lis tout ce qui est reçus par le serveur et j’exécute donc je passe par "handler.BeginReceive(...)" et là impossible.

Je dois mal comprendre à priori ce serait pas le thread principale, pourtant j'ai supprimer TOUT les threads, je n'en utilise plus aucun, même le using est "éteins" ...

Décidément, ça ne voudra jamais que je fasse un jeu en ligne avec Unity :/

J'ai chercher sur google mais c'était sois des sujets où ils ne savent pas, sois des sujets où je ne comprends rien et ça n'a pas l'air d'avoir un rapport avec mon problème.

Déjà j'ai remarquer que sur une variable public impossible d'y écrire (un simple string), il fallait que je retire le public.
J'ai donc fais une variable private qui est utilisé dans l'update pour actualisé un Text d'un Canvas ... Sans soucis ...

Par contre je vais pas m'amuser à tout faire comme ça j'ai vu des trucs qui parlent de lister des events et tout, je sais pas trop comment faire, je dois modifier des Text, instantié des gameobjects (génération map & joueurs), bouger & rotationer les joueurs, executé des animations.

Par exemple quand j'instantiate dans le BeginReceive j'obtiens l'erreur:

Code : Tout sélectionner

Error: UnityEngine.UnityException: get_transform can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
Déjà que je galère toujours à comprendre l'échange TCP, là j'ai pris un code de base (l'exemple sur internet qui envoie un message et qui coupe tout après) et j'ai dû tout modifier pour que ça coupe pas l'échange et que sa vide le texte etc ... J'ai fais à ma façon.

Mais là j'ai du mal à comprendre comment faire, dans un thread quand je programmes sur une form il me suffit de faire un invoke pour le lancer sur le thread main mais là ... Je sais pas ... :pleur4: :pleur4:


Edit: Bon à coup de bricolages (bool + variable gameobject qui permet de vérif si le joueur est créer si non et si la bool est activé alors on instantie, puis il vérifie toute la liste des joueurs si un n'a pas de gameobject, il l'instantie + les mets à jours niveau déplacement).

Bref, j'ai un truc pas trop dégueulasse pour 1 seul compte, dès que j'en co 2 le serveur il suit plus il reçoit trop de packets à la fois et les mélanges xD Je vais essayer de thread chaque clients demain, je pense ça aidera ..

Mais une fois que j'aurais fais un petit truc d'essais on verra, je pense pas continuer et faire uniquement des jeux solo, mais les jeux solo faut une histoire et tout :'( les jeux en ligne c'est plus simple à faire ...

Répondre

Revenir vers « Scripting »