Announcement

Collapse
No announcement yet.

Ultimate Mobile Kit for iOS & Android - Firebase

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [RELEASED] Ultimate Mobile Kit for iOS & Android - Firebase



    Ultimate Mobile Kit
    Firebase mobile implementation for UE4

    Ultimate Mobile Kit is a plugin for UE4 that lets you integrate the Firebase platform for iOS & Android.

    Firebase is a platform that helps you quickly develop high-quality experiences, grow your user base, and earn more money. Firebase is made up of complementary features that you can mix-and-match to fit your needs. You can focus on making your game and not waste time building complex infrastructure.

    Required Unreal Engine 4.15 or above.

    Current plugin version: 1.4.1
    User Guide: https://gamednastudio.com/plugins/do..._UserGuide.pdf


    Buy now on Sellfy (20% OFF): https://sellfy.com/p/fc9C/
    Buy now on Marketplace: https://www.unrealengine.com/marketp...e-kit-firebase



    FEATURES:
    Mobile Analytics – heart of Firebase, see user behavior and measure attribution from a single dashboard.
    Cloud Messaging – lets you reliably deliver and receive messages at no cost.
    Push Notifications – schedule and send from dashboard unlimited notifications to engage the right players at the most relevant time.
    Authentication – authentication system that supports email & password login and adapters for Facebook, Twitter, GitHub, Google Sign-In, and Phone Number Authentication.
    Cloud Storage – store and serve user-generated content like save games, images, audio, video or binary data.
    Remote Config – update your game without deploying a new version and customize content for different Firebase Analytics audiences and measure results.
    Performance Monitoring – get insights into how your game performs from your users’ point of view, with automatic and customized performance tracing.
    Crash Reporting – receive actionable information on stability issues after you publish your game, prioritize crashes by frequency and impact.
    Dynamic Links – improve acquisition and engagement by bringing users directly to content that they were originally searching for, whether they have your game installed or not.
    Invites – complete solution for game referrals and sharing, free email and SMS delivery, let your existing players easy share your game.
    ★ More Firebase features like Hosting and Test Lab.
    ★ All features are exposed to Blueprints.
    ★ Supports gameDNA installer. No more downloading SDKs and creating packages on your own!
    ★ Out-of-the-box for mobile platforms: iOS & Android.
    ★ Works with Blueprint-only & source code projects.
    ★ Works with Launcher & GitHub UE4 versions.

    WHAT YOU GET:
    ★ Full source code available on GitHub private repo!
    ★ Compatible with iOS & Android (all-in-one)
    ★ Easy plugin setup
    ★ All future updates
    ★ Support via e-mail


    Realtime Database is an extension of this plugin.




    Plugin is used in our mobile game CHASERS:




    You can download example project at the following address: https://github.com/gameDNAstudio/ExampleProjects


    Facebook: https://www.facebook.com/gameDNAstudio
    Twitter: https://twitter.com/gameDNAstudio



    More about Firebase you can find on the official website.














    Note: Because of bug in UE4, initial release temporary doesn't support Crash Reporting, Dynamic Links and Invites. These modules will be added in the next major release.


    FULL LIST OF SUPPORTED FUNCTIONS (BLUEPRINTS AND C++):

    ANALYTICS:
    • Firebase Analytics Init
    • Firebase Analytics Log Event
    • Firebase Analytics Log Event Double
    • Firebase Analytics Log Event Integer
    • Firebase Analytics Log Event String
    • Firebase Analytics Set Current Screen
    • Firebase Analytics Set User Id
    • Firebase Analytics Set User Property
    • Is Firebase Analytics Initialized


    AUTHENTICATION:
    • Firebase Authentication Init
    • Firebase Create User With Email And Password
    • Firebase Delete User
    • Firebase Fetch Providers For Email
    • Firebase Get Logged User
    • Firebase Get User Token
    • Firebase Is User Logged In
    • Firebase Link With Credential
    • Firebase Reauthenticate User
    • Firebase Reload User
    • Firebase Send Email Verification
    • Firebase Send Password Reset Email
    • Firebase Sign In Anonymously
    • Firebase Sign In With Credential
    • Firebase Sign In With Custom Token
    • Firebase Sign In With Email And Password
    • Firebase Sign Out
    • Firebase Unlink Provider
    • Firebase Update Email
    • Firebase Update Password
    • Firebase Update User Profile
    • Firebase Verify Phone Number
    • Is Firebase Authentication Initialized


    CRASH REPORTING:
    • Firebase Crash Log


    MESSAGING:
    • Firebase Messaging Init
    • Firebase Send Message
    • Firebase Subscribe Topic
    • Firebase Unsubscribe Topic
    • Is Firebase Messaging Initialized


    REMOTE CONFIG:
    • Firebase Remote Config Init
    • Firebase Remote Config Activate Fetched
    • Firebase Remote Config Fetch
    • Firebase Remote Config Get Boolean
    • Firebase Remote Config Get Float
    • Firebase Remote Config Get Integer
    • Firebase Remote Config Get Keys
    • Firebase Remote Config Get Keys By Prefix
    • Firebase Remote Config Get String
    • Firebase Remote Config Last Fetch Get Info
    • Is Firebase Remote Config Initialized


    STORAGE:
    • Firebase Storage Init
    • Firebase Storage Reference Delete
    • Firebase Storage Reference Get Download Url
    • Firebase Storage Reference Get File
    • Firebase Storage Reference Get Metadata
    • Firebase Storage Reference Put File
    • Firebase Storage Reference Update Metadata
    • Cancel
    • Child
    • Get Bucket
    • Get Full Path
    • Get Parent
    • Get Platform Storage Path
    • Get Progress
    • Get Short Name
    • Get Storage Reference From Path
    • Get Storage Reference From Url
    • Get Storage Reference to Root
    • Is Paused
    • Is Valid
    • Pause
    • Resume


    PERFORMANCE MONITORING:
    • Firebase Start Performance Trace
    • Stop
    • Increment Counter


    CREDENTIAL:
    • Firebase Email Credential
    • Firebase Facebook Credential
    • Firebase GitHub Credential
    • Firebase Google Credential
    • Firebase Twitter Credential


    VARIANT:
    • Firebase Boolean Variant
    • Firebase Float Variant
    • Firebase Integer Variant
    • Firebase String Variant


    APP:
    • Firebase Check Google Play Availability
    • Firebase Make Google Play Available


    ULTIMATE MOBILE KIT COMPONENT:
    • User Signed In
    • User Signed Out
    • User Id Token Changed
    • Message Received
    • Token Received
    Last edited by gameDNA studio; 08-17-2017, 03:30 PM.

  • #2
    If this one is as good as Your previous plugins then... oh boi, it's gonna be awesome

    Comment


    • #3
      Wonderful news
      Put in the next plugin list: Google Services Multiplayer
      Would be great to have a plugin to successfully integrate google services real-time multiplayer as well

      Comment


      • #4
        Originally posted by brunogbrito View Post
        Wonderful news
        Put in the next plugin list: Google Services Multiplayer
        Would be great to have a plugin to successfully integrate google services real-time multiplayer as well
        Added to the list!

        Comment


        • #5
          We are close to release Ultimate Mobile Kit so I'll present in the following days what you should expect from this plugin!

          Mobile Analytics

          At the heart of Firebase is Firebase Analytics, an unlimited analytics solution. Analytics integrates across Firebase features and provides you with unlimited reporting for up to 500 distinct events that you can define using the Ultimate Mobile Kit. Firebase Analytics reports help you understand clearly how your users behave, which enables you to make informed decisions regarding app marketing and performance optimizations. Once the data is captured, it's available in a dashboard through the Firebase console. This dashboard provides detailed insights about your data — from summary data such as active users and demographics, to more detailed data such as identifying your most purchased items.




          Real-time Mobile Analytics

          You can see who is currently playing your mobile game!




          Log Events

          Events provide insight on what is happening in your game, such as user actions, system events, or errors. Analytics automatically logs some events and user properties; you don't need to add any code to enable them. If your game needs to collect additional data, you can log up to 500 different Analytics Event types in your game. There is no limit on the total volume of events your game logs.

          You can log events without parameters, events with string, double and integer types of parameters, and events with multiple parameters (using Firebase Variant).













          Set Current Screen

          Sets the current screen name and screen class, which specifies the current visual context in your game.

          This helps identify the areas in your game where users spend their time and how they interact with your game.





          Set User Property

          User properties are attributes you define to describe segments of your userbase, such as language preference or geographic location.

          Analytics automatically logs some user properties; you don't need to add any code to enable them. If your game needs to collect additional data, you can set up to 25 different Analytics User Properties in your game.

          You can set Analytics user properties to describe the users of your game. You can analyze behaviors of various user segments by applying these properties as filters to your reports. Property must be registered before in the Analytics page of the Firebase console.





          Set User ID

          Firebase generates automatically user ID for player in your game but you can assign custom user ID. This feature must be used in accordance with Google's Privacy Policy.

          Last edited by gameDNA studio; 04-30-2017, 08:53 AM.

          Comment


          • #6
            Cloud Messaging & Push Notifications

            Firebase Cloud Messaging (FCM) is a cross-platform messaging solution that lets you reliably deliver messages at no cost.

            Using FCM, you can notify a client app that new event or other data is available to sync. You can send notification messages to drive user reengagement and retention. For use cases such as instant messaging, a message can transfer a payload of up to 4KB to a client game.

            Firebase Notifications is a service that enables targeted user notifications for mobile game developers.

            Built on Firebase Cloud Messaging (FCM) and the FCM SDK, Firebase Notifications provides an option for developers and organizations seeking a flexible notification platform that requires minimal coding effort to get started, and a graphical console for sending messages. Using the Notifications console GUI, you can reengage and retain your userbase, faster app growth, and support marketing campaigns.

            When your game is in the background on a user's device, notifications are delivered to the system tray. When a user taps on the notification, the game launcher opens your game. If you want, you can also add client message handling to receive notifications in your game when it is already in the foreground on the user's device.





            Access the device registration token

            On initial startup of your game, the FCM SDK generates a registration token for the client game instance. If you want to target single devices, or create device groups for FCM, you'll need to access this token.

            You can access the token's value through the TokenReceived callback in UltimateMobileKit component.




            Subscribe/Unsubscribe

            Based on the publish/subscribe model, FCM topic messaging allows you to send a message to multiple devices that have opted in to a particular topic. You compose topic messages as needed, and FCM handles routing and delivering the message reliably to the right devices.

            Some things to keep in mind about topics:
            • Topic messaging supports unlimited topics and subscriptions for each app.
            • Topic messages are optimized for throughput rather than latency. For fast, secure delivery to single devices or small groups of devices, target messages to registration tokens, not topics.
            • If you need to send messages to multiple devices per user, consider device group messaging for those use cases.


            To subscribe to a topic, call Firebase Subscribe Topic from your game. This makes an asynchronous request to the FCM backend and subscribes the client to the given topic. If the subscription request fails initially, FCM retries until it can subscribe to the topic successfully. Each time the app starts, FCM makes sure that all requested topics have been subscribed.



            To unsubscribe, call Firebase Unsubscribe Topic, and FCM unsubscribes from the topic in the background.




            Receive messages

            FCM delivers topic messages in the same way as other downstream messages.

            By handling MessageReceived callback in UltimateMobileKit component, you can perform actions based on the received message and get the message data.




            Send upstream messages

            If your game server implements the XMPP Connection Server protocol, it can receive upstream messages from a user's device to the cloud.






            Push Notifications composer

            You can simply send Push Notifications from Firebase dashboard. Notifications can be send to a user segment, a topic and a single device.

            Comment


            • #7
              Authentication

              Firebase Authentication provides backend services, easy-to-use functions, and ready-made UI libraries to authenticate users to your game. It supports authentication using passwords, popular federated identity providers like Google, Facebook and Twitter, and more.

              Firebase Authentication integrates tightly with other Firebase services, and it leverages industry standards like OAuth 2.0 and OpenID Connect, so it can be easily integrated with your custom backend.

              Firebase Authentication is compatible with other gameDNA’s plugin Extended Facebook Online Subsystem.

              To sign a user into your app, you first get authentication credentials from the user. These credentials can be the user's email address and password, or an OAuth token from a federated identity provider. Then, you pass these credentials to the Firebase Authentication SDK. Google’s backend services will then verify those credentials and return a response to the client.

              After a successful sign in, you can access the user's basic profile information, and you can control the user's access to data stored in other Firebase products. You can also use the provided authentication token to verify the identity of users in your own backend services.





              Create User

              Create User With Email And Password

              Create a form that allows new users to register with your app using their email address and a password. When a user completes the form, validate the email address and password provided by the user, then pass them to the Firebase Create User With Email And Password function.




              Send Email Verification

              You can send an address verification email to a user with the Firebase Send Email Verification function. You can customize the email template that is used in Authentication section of the Firebase console.




              Send Password Reset Email

              You can send a password reset email to a user with the Firebase Send Password Reset Email method. You can customize the email template that is used in Authentication section of the Firebase console.





              Link with external providers

              Link With Credential

              You can allow users to sign in to your game using multiple authentication providers by linking auth provider credentials to an existing user account. Users are identifiable by the same Firebase user ID regardless of the authentication provider they used to sign in. For example, a user who signed in with a password can link a Google account and sign in with either method in the future. Or, an anonymous user can link a Facebook account and then, later, sign in with Facebook to continue using your game.

              Currently supported providers:
              • Email/Password (standard)
              • Facebook
              • Google
              • Twitter
              • GitHub

              You can link provider with an existing user account by initializing appropriate Firebase Credential and calling Firebase Link With Credential. Tokens for Credentials you should obtain on your own (for example for Facebook using Extended Facebook Online Subsystem).



              If the call to Firebase Link With Credential succeeds, the user can now sign in using any linked authentication provider and access the same Firebase data.


              Unlink Provider

              You can unlink an auth provider from an account, so that the user can no longer sign in with that provider. To unlink an auth provider from a user account, pass the provider ID to the Firebase Unlink Provider function.




              Fetch Providers for Email

              Firebase Fetch Providers for Email asynchronously requests the IDPs (identity providers) that can be used for the given email address. Useful for an "identifier-first" login flow.






              Sign In

              Create a form that allows existing users to sign in using their email address and password. When a user completes the form, call the chosen signed in function.


              Sign In With Email And Password

              The steps for signing in a user with a password are similar to the steps for creating a new account. When a user signs in to your game, pass the user's email address and password to Firebase Sign In With Email And Password.




              Sign In Anonymously

              You can use Firebase Authentication to create and use temporary anonymous accounts to authenticate with Firebase. These temporary anonymous accounts can be used to allow users who haven't yet signed up to your game to work with data protected by security rules. If an anonymous user decides to sign up to your game, you can link their sign-in credentials to the anonymous account so that they can continue to work with their protected data in future sessions.




              Sign In With Credential

              After a user signs in for the first time, a new user account is created and linked to the credentials - that is, the user name and password, or auth provider information - the user signed in with. This new account is stored as part of your Firebase project, and can be used to identify a user across every game in your project, regardless of how the user signs in.




              Sign In With Custom Token

              You can use your custom Auth Token authentication. An error is returned, if the token is invalid, expired or otherwise not accepted by the server.




              Get User Token

              The Java Web Token (JWT) that can be used to identify the user to the backend.
              If a current ID token is still believed to be valid (i.e. it has not yet expired), that token will be returned immediately. You may set the optional force_refresh flag to get a new ID token, whether or not the existing token has expired. For example, a you may use this when they have discovered that the token is invalid for some other reason.






              Managing Users

              Is User Logged In

              You can check if user is logged in to your game calling Firebase Is User Logged In.




              Get Logged User

              To get currently logged user’s profile information, call Firebase Get Logged User.




              Sign Out

              To sign out a user from game, call Firebase Sign Out function.




              Reauthenticate User

              Some security-sensitive actions—such as deleting an account, setting a primary email address, and changing a password—require that the user has recently signed in. If you perform one of these actions, and the user signed in too long ago, the action fails.
              When this happens, re-authenticate the user by getting new sign-in credentials from the user and passing the credentials to Firebase Reauthenticate User.




              Reload User

              Firebase Reload User refreshes all the data for currently logged in user.




              Delete User

              You can delete a user account with the Firebase Delete User method. You can also delete users from the Authentication section of the Firebase console, on the Users page. To delete a user, the user must have signed in recently.






              Update User Profile

              Update Email

              You can set a user's email address with the Firebase Update Email function. To delete a user, the user must have signed in recently.




              Update Password

              You can set a user's password with the Firebase Update Password function. To delete a user, the user must have signed in recently.




              Update User Profile

              You can update a user's basic profile information - the user's display name and profile photo URL - with the Firebase Update User Profile function.






              Authentication Listener

              To respond to sign-in and sign-out events, attach the UltimateMobileKit component to the global actor (for example Game Mode). This listener gets called whenever the user's sign-in state changes. Because the listener runs only after the authentication object is fully initialized and after any network calls have completed, it is the best place to get information about the signed-in user. By using a listener, you ensure that the Auth object isn't in an intermediate state — such as initialization — when you get the current user.



              Comment


              • #8
                Cloud Storage

                Cloud Storage is built for game developers who need to store and serve user-generated content, such as save games, photos or videos.

                Developers use the Firebase SDKs for Cloud Storage to upload and download files directly from clients. If the network connection is poor, the client is able to retry the operation right where it left off, saving your users time and bandwidth.

                The Firebase SDKs for Cloud Storage integrate seamlessly with Firebase Authentication to identify users, and Google provides a declarative security language that lets you set access controls on individual files or groups of files, so you can make files as public or private as you want.





                Storage Reference

                Your files are stored in a Google Cloud Storage bucket. The files in this bucket are presented in a hierarchical structure, just like the file system on your local hard disk. By creating a reference to a file, your game gains access to it. These references can then be used to upload or download data, get or update metadata or delete the file. A reference can either point to a specific file or to a higher level node in the hierarchy.



                Create a reference to upload, download, or delete a file, or to get or update its metadata. A reference can be thought of as a pointer to a file in the cloud. References are lightweight, so you can create as many as you need. They are also reusable for multiple operations.

                References are created from the storage service on your Firebase game by calling one of three functions:
                • Get Storage Reference to Root – reference to the highest level of your storage
                • Get Storage Reference from Path – reference to the specified path from root
                • Get Storage Reference from Url – URL of the form gs://<your-cloud-storage-bucket>.


                You can create a reference to a location lower in the tree, say images/space.jpg, by using the child method on an existing reference.



                You can also use the Parent function to navigate up one level in our file hierarchy.



                Child and Parent can be chained together multiple times, as each returns a reference. The exception is the Parent of Root, which is an invalid Storage Reference.



                Platform Storage Path

                Get Platform Storage Path function returns a path to the physical storage on iOS or Android device (you need this for example for download/upload files).





                Download File

                Cloud Storage allows developers to quickly and easily download files from a Google Cloud Storage bucket provided and managed by Firebase.

                To download a file, first create a Cloud Storage reference to the file you want to download.

                You can create a reference by appending child paths to the storage root, or you can create a reference from an existing gs:// or https:// URL referencing an object in Cloud Storage.

                Once you have a reference, you can download files from Cloud Storage in two ways:
                • Generate an string URL representing the file online
                • Download to an specific path on the device


                If you already have download infrastructure based around URLs, or just want a URL to share, you can get the download URL for a file by calling the Firebase Storage Reference Get Download Url function on a storage reference.



                The Firebase Storage Reference Get File function downloads a file directly to a local device. Use this if your users want to have access to the file while offline or to share in a different app.





                Upload File

                Cloud Storage allows developers to quickly and easily upload files to a Google Cloud Storage bucket provided and managed by Firebase.

                To upload a file, first create a Cloud Storage reference to the location in Cloud Storage you want to upload the file to. You cannot upload data with a reference to the root of your Google Cloud Storage bucket. Your reference must point to a child URL. Once you have a reference, you can upload files to Cloud Storage.

                You can upload local files on the devices, such as photos and videos from the camera or saved games, with the Firebase Storage Reference Put File function. You can also include metadata when you upload files.





                Delete File

                Of course you can also delete files from Cloud Storage.

                To delete a file, first create a reference to that file. Then call the Firebase Storage Reference Delete method on that reference.





                Monitor progress of Downloads/Uploads

                Downloads/Uploads functions returns Storage Listener object to which you can bind OnProgressEvent and OnPausedEvent in order to monitor the progress of files tasks.





                Manage Downloads/Uploads

                In addition to starting downloads/uploads, you can pause, resume, and cancel downloads/uploads using the Pause, Resume, and Cancel functions on Storage Controller.





                Get/Update Metadata

                After uploading a file to Cloud Storage reference, you can also get and update the file metadata, for example to update the content type.

                You can update file metadata at any time after the file upload completes by using the Firebase Storage Reference Update Metadata function. Only the properties specified in the metadata are updated, all others are left unmodified. You can delete writable metadata properties by passing the empty string.



                File metadata contains common properties such as name, size, and content_type (often referred to as MIME type) in addition to some less common ones like content_disposition and time_created. This metadata can be retrieved from a Cloud Storage reference using the Firebase Storage Reference Get Metadata function.



                Comment


                • #9
                  Remote Config

                  Firebase Remote Config is a cloud service that lets you change the behavior and appearance of your game without requiring users to download a game update. When using Remote Config, you create in-game default values that control the behavior and appearance of your game. Then, you can later use the Firebase console to override in-game default values for all game users or for segments of your userbase. Your game controls when updates are applied, and it can frequently check for updates and apply them with a negligible impact on performance.





                  Initialization

                  Before making any call to Firebase Remote Config you should first execute Firebase Remote Config Init function. If result is fail, study logs to find what causes an issue.

                  You can set in-app default parameter values in the Remote Config object, so that your game behaves as intended before it connects to the Remote Config service, and so that default values are available if none are set in the service. Make array with Firebase Variant parameters and pass to the Firebase Remote Config Init function.





                  Get parameter values to use in your game

                  Now you can get parameter values from the Remote Config object. If you set values in the Remote Config service, fetched them, and then activated them, those values are available to your game. Otherwise, you get the in-app default parameter values configured using Firebase Remote Config Init.

                  To get these values, call the method listed below that maps to the data type expected by your game, providing the parameter key as an argument.



                  You can get the set of all keys (Firebase Remote Config Get Keys) in the Remote Config or the set of that start with the given prefix (Firebase Remote Config Get Keys By Prefix).







                  Fetch and activate values from the service (as needed)

                  1. To fetch parameter values from the Remote Config service, call the Firebase Remote Config Fetch. Any values that you set on the Remote Config Server are fetched and cached in the Remote Config object.
                  2. To make fetched parameter values available to your game, call the Firebase Remote Config Activate Fetched function.

                  Because these updated parameter values affect the behavior and appearance of your game, you should activate the fetched values at a time that ensures a smooth experience for your user, such as the next time that the user opens your game.





                  You can also get information about last fetch calling Firebase Remote Config Last Fetch Get Info.

                  Comment


                  • #10
                    Ultimate Mobile Kit 1.0 released!


                    Buy now on Sellfy (20% OFF): https://sellfy.com/p/fc9C/

                    Plugin is also submitted to the UE4 Marketplace but it needs some time for review and approval.










                    Comment


                    • #11
                      great work, excited to check this out!
                      ZOMBIE TOWN AHHH (ANDROID/STEAM) | RIDE SHARE EMPIRE (ANDROID/GAME JAM) | NEVER NOT KNIGHT (ANDROID/GAME JAM) | TWITTER | MY UE4 TUTORIALS | ANSWERHUB

                      Comment


                      • #12
                        Originally posted by BPANDREW View Post
                        great work, excited to check this out!
                        Thank you!

                        Comment


                        • #13
                          Ultimate Mobile Kit Plugin 1.0.1 released!


                          CHANGELOG:
                          - Fixed crash in Remote Config Initialization with parameters on Android.
                          - Added Checking Google Play Services Availability service.
                          - Added missing retrieving Android Platform Storage Path.
                          - Added custom icon to the Android notifications.



                          You can download it from GitHub repository on releases tab or your Sellfy dashboard.


                          If you haven't owned it yet, you can buy now on Sellfy.

                          Comment


                          • #14
                            Ultimate Mobile Kit Plugin 1.1.0 Preview for UE 4.16 Preview!


                            I've just released plugin binaries for Unreal Engine 4.16 Preview.
                            You can download it from GitHub repository on releases tab.



                            If you find any bug, feel free to report it

                            Comment


                            • #15


                              Ultimate Mobile Kit Plugin 1.1.0 for UE 4.16 final release!


                              We've just released plugin binaries for Unreal Engine 4.16
                              You can download it from GitHub repository on releases tab or your Sellfy dashboard.



                              CHANGELOG:
                              • Google Play Services updated to 10.2.1
                              • Tweaks for UE 4.16 compatibility



                              If you haven't owned it yet, you can buy now on Sellfy.
                              Last edited by gameDNA studio; 05-24-2017, 07:06 PM.

                              Comment

                              Working...
                              X