Collaborative Notes Plugin (Not a chat!)

That’s a valid point. Made the change.

Update

Saves notes!

It saves to the game, so you can have notes across the game’s places, and you can have different notes for different games.

Also, added timestamps to notes. This was used to figure out the order of saved notes, and I figured it would be nice to have it displayed.

Update your plugins!

6 Likes

Yes, yes they do.
Rightfully so, too.

4 Likes

Just one more suggestion I’d like to make. You should disable filtering on places that are not setup as a team create, currently with how you filter the notes a team create would be required to filter. So when a team create is not made notes will default to “Error filtering text”.

I tested in studio and an easy way to check if it is a team create or not would be checking if game.Players.LocalPlayer ~= nil, if it is true then the place is a team create and vice-versa. I am positive this abides by the policy with filtering as you don’t need to filter the text if only the client (or only user in studio) would see it.

This would probably defeat the purpose of the plugin name though as it would not be very collaborative if you’re all alone. :stuck_out_tongue:

2 Likes

Studio is broken ATM, but I’ll add that in when I can.

2 Likes

I’ll have to make note to try this out.

11 Likes

This update is so great and intuitive that someone could almost (mistakenly) confuse this for an unfiltered chat. I cannot wait to leave my notes in one game, open a different set of notes in another game, and then go back to a different place in that original game and find the collaborative notes we made still there.

My only concern is if one member of the development team was away and an important note was left while they were absent, would they not be able to see this note when they join back later? Note that they wouldn’t want to respond to this note but it may be important for collaborative note-taking.

5 Likes

I guess a solution to this could be whenever both user’s join the team create the settings.json sync up in some form, such as comparing data or when the data was last updated since they should both have the same data? I don’t know how possible this is though.

This would be assuming one of the two eventually join. I could be wrong but I’m pretty sure this plugin does not currently give notes to users that join the team create if they were not in the team create as the note was made.

1 Like
  1. Data must be per place
  2. Notes can be created while a player is offline
  3. Team Create uses a server to connect studio users hence why players exist and the NetworkReplicator exists.

That means the most efficient way to communicate between clients without having server access would be to use some kind of replication. Bindables and Remotes are useless in TC due to the server aspect.

I have no idea how this plugin replicates notes and I haven’t had time to look into it but I’d assume it uses some kind of property replication.

One idea I can think of would be to create a Folder based structure for notes using Instances. This is per place, replicates properly to other studio clients, can be stored in a location such as ServerStorage so it isn’t replicated to game clients, and notes can save to the cloud.

I’m gonna hop on studio pretty soon and see if I can find some good locations for something like this and also take a look at the plugin.

1 Like

There are a few ways to have notes appear to users who weren’t there when the note was made, but none of them are great and most of them would clutter the DataModel in some way.

One of the nice things about this plugin is that there’s no setup required and there’s no clutter at all. It’s very easy to use.

1 Like

I found how you’re replicating messages. Based on how you’re replicating messages you can replicate chats every time a player loads. A message can then be assigned a unique “id.” I used os.time()+tick()%1 for example (to keep things backwards compatible and still keep ids unique).

I implemented this “id” system, as well as added seconds to timestamps. I also fixed a typo which prevented loading where game.PlaceId was used instead of game.GameId. I moved this to a variable at the top of the plugin.

Plugin.rbxm (13.5 KB)

Edit:
Also I’m going to add a fix to players who load in not receiving new messages. For this I’ll use Players.PlayerAdded to detect a player joining the TC and have all players replicate their messages (which will sync all clients with each other).

Here it is:
I’ll need to test this later but it should be working theoretically. Plugin.rbxm (13.6 KB)

2 Likes

Well, that’s a pain! Personally never used any of the, either online or offline, but I know plenty of others who do for joke purposes.

@boatbomber Please confirm whether the following texts are replaced with “weeb”:

  • uWu, UwU
  • oWo, OwO
  • Nani

That method won’t actually work in all cases.

Player A joins, says “Hello World”
Player A leaves
Player B joins

Player B will not have the old message

2 Likes

They won’t have the old message until Player A rejoins. There isn’t a fix to that without running into the issue of needing instances to store things long-term.

They are :rofl:

They get blocked by the Roblox filter, so I blocked them too as a joke

That’s what I originally said.

Yep. The changes I made will make players do the following:
On join they replicate all stored messages for the current game
When another player joins all stored messages for the current game are replicated again.

This ensures that messages remain synced for all players. If Player A joins while Player B is working, Player A will broadcast any messages they saw that Player B may have missed, and Player B will broadcast any messages they saw that Player A may have missed.

1 Like

I understand what you did, I have a working prototype of that too. I didn’t post it because one of the main reasons people want to sync is so that if they are on different timezones and work separately, they can leave notes behind.

This method doesn’t really work that well, in the sense that it only works when both players can join together. It functions, but fails to complete the design goal.

How does said filter work? I.E, assuming the following “sentence” was inputted:

“Nani! Who are you? uWu”

I don’t know what any of these faces mean, just that nani translates to what.

Would it go to:

A. weeb
B. weeb! Who are you? weeb
C. None of the above.

1 Like

B 30 characters requirement

1 Like