Chickynoid, server authoritative character replacement

Chickynoid holds all information inside of tables inside of modules. You access it by requiring the appropriate module, and rummaging around in the tables provided.

2 Likes

You cannot access the player’s character from the server, characters are rendered only on client side, you do not need a player’s character to do so, I already explained how.

To access a player’s record and all their different objects/data, require the “ServerModule” and grab their playerRecord.

local playerRecord = ServerModule:GetPlayerByUserId(ID)

then from there you can access their data, if I am not incorrect you can get their chickynoid and then their simulation to teleport them like this:

local playerRecord = ServerModule:GetPlayerByUserId(MyID)
local chickynoid = playerRecord.chickynoid
local simulation = chickynoid.simulation

simulation:SetPosition(Position, true)

I encourage you to read around the modules and their functions and see what they do, chickynoid isn’t documented, so before I leave, I’ll explain some of the basics.

Simulation
This is the class that takes care of doing the physics work for chickynoids, all the physics are done here along with the math libraries like “CollisionModule”, simulations have a state table, this state table ensures that data inside stays in sync with server and client, whenever the state.pos desyncs it will resync all values inside.

there is also a constants table which contains stuff like movement variables, I suggest reading the “MoveTypeWalking” and “NicerHumanoid” mods to check out how constants are being used.

CharacterData

The characterData objects basically just holds data related to the character itself, it is often used to copy data from simulation.state and other places to be stored here, characterData is sent to all other clients so they can render said data, data sent by characterData is serialized to use less bandwith.

In order to add data to the “serialized” table inside characterData you must set up these steps.

Set your data inside the serialized table

Define the lerp function
image

Add it to the keys table
image

Choose a pack function
image

Add the write function to the SerializeTobitBufferFast function

CharacterModel

The characterModel script is a client only script, it is used by a player’s client to render data from a characterData object replicated to them, characters are not instantly created upon being constructed, make sure to use the FastSignals in them to wait for them properly.

CharacterMods

These scripts are pretty much where you will write any sort of movement code, you can also write other things but this is the most common thing you will write on them.

They have a Start function which runs code upon entering the MoveType, an End function which runs when exiting the MoveType, a function called AlwaysThink which runs at all times regardless if we are on that MoveType, and lastly a Think function which only runs when inside the MoveType.

they work like states on a state machine, I encourage you to read the MoveTypeWalking and MoveTypeFlying scripts for more info.

those are some of the basics.

5 Likes

For anyone curious, chickynoid-to-chickynoid collisions are a possible feature to implement via updating a player’s collision box’s hull whenever the position updates. You can even setup collisions exceptions during sweep and allow specific collisions to(or not to) take place(as I do when NPCs collide with each other).

So far, it’s been working great with no drawback in performance. And yes, I prefer capsule collisions over boxes

Video Showcase

6 Likes

Another reminder that I will need to add another super hard feature to my game :sob:, Ill neglect player collisions for now.

Also that game looks fire.

1 Like

So I’ve been banging my head against a wall for like the past few days trying to figure this out
image
I’m trying to play animations on other channels but for some reason animCounter1 and animNum1 do not replicate to the client, thus the animation doesnt play. Can anyone help me with this?

1 Like

They do not work, chickynoid recieves the replicated data, but the characterModel script ignores all other channels.

I have a fork that fixes that

Enable other animChannel support for Chickynoid - Resources / Community Resources - Developer Forum | Roblox

it just has a small bug ill fix later related to stopping anims

2 Likes

Hey! Thank you so much for the reply.
Unfortunately still happening. I have no idea why.

1 Like

If you play an animation from the server on a characterdata, the client who is controlling that characterdata will not get the animation replicated, Only other clients.

Are you sure this is not your issue?

1 Like

Sorry for the late reply!
Seems like you’re right. It only plays on other clients. How can I fix this?

1 Like

It is done like this because the client is supposed to play his own animations on his worldstate, this way when anims play from the server they dont override his.

If the action is completely server sided and theres no way for the client to play his own animation, then i suggest just using a remote event to play the anims on his client.

1 Like

I see. Thank you so much for the help!

1 Like

I have a question how am I supposed to make bots without the server in it or have it when its in the server and not showing the hitbox?

Anyone here know how I’d go about creating a custom chickynoid object, essentially an object with its own properties, its own friction speed etc…? I’m trying to make blocks which can be pushed. I’m reading through the simulation module, as well as the collision module but I’m not entirely sure how to make this practically. I’ve managed to create an exception by adding a few lines to movetypewalking- so the boxes arent stepped up on. I’ve also noticed a bug when working with the box. When I apply a vector force to it, the player can somehow begin pushing the object with their serverchickynoid. When the box’s acceleration comes to a halt and its in a standstill, the player can no longer push the box and the box is simply still. The boxes’ network owner is the server during this entire situation.

Might I add that, the collision on the box works dynamically, and is not stuck in place. I did this by uncommenting the code in CollisionModules’ function ProcessCollisionOnInstance. Perhaps it was commented due to the fact that it hasn’t been polished and that may cause me to come against issues in the future, although as far as dynamic collisions are it seems to be working just fine (as stated I tested player to player collisions so it doesn’t seem to be useless and there’s also no seemingly obvious mispredictions or performance issues).

I am starting a new project and wondering if this is worth implementing into the game, I am mainly interested in the hitbox aspects of Chickynoid. I have seen examples mainly with Raycast hitboxes, and I wondered if Chickynoid is also better for region3 / box hitboxes?

as far as accuracy for server-client goes yes, it is better.

Chickynoid is simultaneously the best and worst way to network on Roblox. With the system being deterministic, you’ll find that trying to accomplish even simple things will be much less intuitive, ESPECIALLY because no one has written documentation on it. In my experience, it took me a few solid weeks just to wrap my head around how everything works, and even then I still don’t know how to do everything I want to. TLDR Chickynoid is far superior when it comes to hitbox and region3 detection, but you will have to write out custom systems in order to utilize it, which could stall development and give quite a few headaches.

2 Likes

anyone know how to remove the large buffer between client and server rig replication? I’m noticing that the server hitbox of chickynoid is perfect and I want the client to be lerped straight to that instead of whatever it is currently - its causing a lot of visual discrepencies

to add to this, if im not mistaken isn’t chickynoid meant to run prediction of all clients? or is it only run it on your own players, if its the former then why would the client replication be so far behind the server positions, and if the latter then i fear its applications although still many are of a smaller scope than i expected

The amount of buffering the client does is adjustable on the client. Its by default set to 50ms of buffer iirc, which is shorter than roblox’s default 100ms of buffer.