Setting S to 0 or nothing resets H to 0, which makes it hard type in the fields directly. Same for V, which resets S and H

circle should adjust colors to current V value or have an extra colored selector for V like this(src)

Alpha is missing (?)

Support for Hex-codes

Thanks. I made a card for these and will get to it soon.

126. Bug: Calling World_SendMessage[ToAll]() in an Automator (before the round is started) crashes the game.I've fixed the crash, however the Automators cannot send messages. What are you trying to use this for?

127. Feature Request: CollisionFilterTriggerPreset that triggers on everything but not Self. I want to add a triggerbox to a moving physics object (the box overlaps the collision model), but it is triggered by its own collision component on spawn. I need a filter presets that ensures that message.triggerId is not the same as message.otherId. Currently its only solvable by setting the collision type to hitbox, which I do not want.This sounds like maybe this should just be the behavior regardless of the preset. I'll chat with the rest of the team about it.

128. Bug: Grid increase/decrease does not work with every keyboard layout (i.e. german)What exactly is the problem? Is it the default keys don't work, but remapping them does, or does it not work even remapped?

129. Q: I am not supposed to add 2 directional lights, right? Only one of them casts a shadow, and which one depends on the current viewing angles.This is limitation of the current implementation. I'll make it so that more than 1 directional light is supported in the (near) future.

130. Remark: Model editor does not open for standard models. Not sure if it should. Works fine for self made ones.This is the intended behavior since you don't have the "source" files for the other models (i.e. the fbx files). In the future I'm going to make it so they open in a "read only" mode like a model viewer.

126. Bug: Calling World_SendMessage[ToAll]() in an Automator (before the round is started) crashes the game.I've fixed the crash, however the Automators cannot send messages. What are you trying to use this for?

As mentioned here, I wanted to have an automator and a script which do roughly the same thing. So to reduce code duplication my firstsecond impulse was to let the automator call the script. This was when I noticed the crash; have duplicated the code now.
Edit: my first impulse was to add the OnSetText() event handler to the automator.

128. Bug: Grid increase/decrease does not work with every keyboard layout (i.e. german)What exactly is the problem? Is it the default keys don't work, but remapping them does, or does it not work even remapped?

Ha, did not even see they can be remapped. Remapping works, but with the default mapping (LeftBracket/RightBracket) on a german keyboard layout, no key or key combination triggers the increase or decrease of the grid size. In particular not even pressing [ or ], which on a german keyboard are mapped to AltGr+8 and 9. Switching to US layout (where [ and ] are to the right of the P) in windows works.
Maybe related: with a german keyboard layout enabled, everything under Options->Bindings still registers the US keys. I.e. hitting + or #, which have their own keys, registers as = and 3. Keys that don't have an equivalent like ü,ö,ä,ß don't register at all. NS2 had this right.

129. Q: I am not supposed to add 2 directional lights, right? Only one of them casts a shadow, and which one depends on the current viewing angles.This is limitation of the current implementation. I'll make it so that more than 1 directional light is supported in the (near) future.

Don't actually need it and it's probably rare that it makes sense (i.e. 2 suns), just noticed the slight glitches.

As mentioned here, I wanted to have an automator and a script which do roughly the same thing. So to reduce code duplication my firstsecond impulse was to let the automator call the script. This was when I noticed the crash; have duplicated the code now.
Edit: my first impulse was to add the OnSetText() event handler to the automator.

Great, so the current build so address this problem without the need to duplicate the code.

Ha, did not even see they can be remapped. Remapping works, but with the default mapping (LeftBracket/RightBracket) on a german keyboard layout, no key or key combination triggers the increase or decrease of the grid size. In particular not even pressing [ or ], which on a german keyboard are mapped to AltGr+8 and 9. Switching to US layout (where [ and ] are to the right of the P) in windows works.
Maybe related: with a german keyboard layout enabled, everything under Options->Bindings still registers the US keys. I.e. hitting + or #, which have their own keys, registers as = and 3. Keys that don't have an equivalent like ü,ö,ä,ß don't register at all. NS2 had this right.

It looks like some changes were made in NS2 after I forked the codebase for Future Perfect. I've integrated these now and made a new build in the "beta" branch. When you get a chance, could you check it out and see if it's working the way you'd expect?

As mentioned here, I wanted to have an automator and a script which do roughly the same thing. So to reduce code duplication my firstsecond impulse was to let the automator call the script. This was when I noticed the crash; have duplicated the code now.
Edit: my first impulse was to add the OnSetText() event handler to the automator.

Great, so the current build so address this problem without the need to duplicate the code.

Could you elaborate on this? What exactly did you change? Can the automator handle OnSth() events now? Or is it now able to send messages? Only after the game started?

Ha, did not even see they can be remapped. Remapping works, but with the default mapping (LeftBracket/RightBracket) on a german keyboard layout, no key or key combination triggers the increase or decrease of the grid size. In particular not even pressing [ or ], which on a german keyboard are mapped to AltGr+8 and 9. Switching to US layout (where [ and ] are to the right of the P) in windows works.
Maybe related: with a german keyboard layout enabled, everything under Options->Bindings still registers the US keys. I.e. hitting + or #, which have their own keys, registers as = and 3. Keys that don't have an equivalent like ü,ö,ä,ß don't register at all. NS2 had this right.

It looks like some changes were made in NS2 after I forked the codebase for Future Perfect. I've integrated these now and made a new build in the "beta" branch. When you get a chance, could you check it out and see if it's working the way you'd expect?

Reassigning key works now, similar to NS2 (that is keys like "ü" show up as "#41" but work as expected). Still "LeftBracket" and "RightBracket" cannot be triggered with the german layout.

117. Feature Request: A method that returns the position of the center of mass

We could add that, although it would have to do some computations for something like rag doll where there might be multiple bodies. What are you going to use it for?

I have only one solid object and do not care about ragdolls. I need to know the location of the center of mass, so I know where to add pairs of local forces that have point symmetry. Here, I made a video. Note that the 4 hoverpads are not symmetric around the center of mass, which causes extensive swinging.

Could you elaborate on this? What exactly did you change? Can the automator handle OnSth() events now? Or is it now able to send messages? Only after the game started?

I changed it so that calling the function won't crash the game, however the message won't go anywhere. Sending messages between automators is something that we could add, but I haven't seen a use for it yet.

I have only one solid object and do not care about ragdolls. I need to know the location of the center of mass, so I know where to add pairs of local forces that have point symmetry. Here, I made a video. Note that the 4 hoverpads are not symmetric around the center of mass, which causes extensive swinging.

Ok, that looks cool. I added the function (Collision_GetLocalCenterOfMass). It's available in the beta branch right now.

I have only one solid object and do not care about ragdolls. I need to know the location of the center of mass, so I know where to add pairs of local forces that have point symmetry. Here, I made a video. Note that the 4 hoverpads are not symmetric around the center of mass, which causes extensive swinging.

the builder (drag and dropping into the game window) doesn't like the file extensions for FBX files in capitals. since this varies in versions of 3ds max i assume it will also vary between other modeling programs too. Was a scratching my head over this one for a good ten minutes.
Might also be worth noting that currently .fbx files on my system do not currently have a default program.

the builder (drag and dropping into the game window) doesn't like the file extensions for FBX files in capitals. since this varies in versions of 3ds max i assume it will also vary between other modeling programs too. Was a scratching my head over this one for a good ten minutes.
Might also be worth noting that currently .fbx files on my system do not currently have a default program.

This was change we made because the different captializations caused of lot of additional complexity since the engine itself is case sensitive to make other platforms work consistently. We might go back to supporting this in the future for the sake of user friendliness, but at the moment it was causing too many headaches.

Primarily filesize for the game and steam workshop 100mb limits. I can't make audio heavy games with those restrictions. If not midi, how about maybe adding tracker support? That seems like a good alternative to midi for the games I would like to create, and is something quite well used in the game industry.

Slowly turning the mousewheel will produce outputs like 2 2 then 3 3, then 4 4
Right now I have a hard time to make sure that a function is only called once per button press.
Until here, that seems like a minor annoyance, but I actually believe this to be a major bug, and here is why:
When you turn your mousewheel rapidly, the output changes

2
2
3
3
4
4
5
6
5
7
8
6
...
97
83
98
84
99
100
85
101
86
102
87

When I dump _G, I actually get two dumps that differ in _G.upcount
Tests indicate that for players connected over the network, the function is only called once.
Making the functions and variables local does not change anything.

139. Feature Request: "if bit.band(input.actions, Action.Next) ~= 0 then ..." is nice and all, but maybe there should be a high level function like IsPressed(Action.Next). While we are at it: when you want to query the state of a button outside of the OnInput function, you need to introduce a global variable and sync it with the input bitmask, why not have the current input state available globally at all times?

If it's not immediatly clear what's happening here, I am accessing freed chunks of memory here. I am not too familiar with the internals of Lua, but I suppose that the CDATA block message.var is passed as reference and then deallocated after the OnTest function is left. timedcallback then fails to make it's own copy of the object. I can circumvent this by changing to call to timedfunction(message.var*1, 0) [or in my case timedfunction(message.targetCoords*Coords.GetIdentity(), 0)]

142. Q: Is there a way to have a child entity that does not rotate with it's parent, but still moves along with it? Other by manually rotating the child in the opposite direction of the parent.

143. Q: Is there a way to have an object that is not visible to everyone? Think of cloaked skulks of waypoint breadcrumbs.

Additional Remarks to 123.:
Recently I have worked alot with moving child entities, and came to the conclusion that the local version like Self_GetLocalCoords (and its pendants for angles, positions and setters and getters) are the ones you almost always want. Considering how Bone_GetCoords already returns the local coordinates, I propose that the generic function like *_GetCoords, *_SetAngles, ... work in the local reference frame and specialized ones are added to access the global/absolute coordinates.

Apologies in advance, this is probably not going to be the most satisfying set of replies!

136. Bug:: single character variables like

Thanks, I fixed it.

137. Bug: World_SendMessage/World_SendMessageToAll nowhere mentioned in api.html or the rest of the docs

The API documentation is currently only including functions that are implemented in C++. These particular functions are implemented in Lua. We'll include them in the future though.

138. Bug:: I noticed that a function that is bound the to mousewheel (Action.Next) is always triggered twice. Here is some example code

This sounds like it's behaving properly and what you are seeing is the result of running the code on both the server and client. If you change it to print(World_GetName(), upcount) you should be able to see the two different sources. The same code may run on the client multiple times as well due to client side prediction, but before it runs each time it should reset upcount and thus produce the same result.

139. Feature Request: "if bit.band(input.actions, Action.Next) ~= 0 then ..." is nice and all, but maybe there should be a high level function like IsPressed(Action.Next). While we are at it: when you want to query the state of a button outside of the OnInput function, you need to introduce a global variable and sync it with the input bitmask, why not have the current input state available globally at all times?

This has to do with the networking. It would probably make sense to introduce some more concise way of determining of a button is pressed, but adding a global function wouldn't make sense in all contexts. For example, say you have a script on an object which is not a player; what should the functions return in that case? I will give some consideration how this could be done in a way that doesn't lead to confusing behavior.

140. Remark: Consider the following code

Yes you are right, this is a good catch. Another way to do it is like Coords(message.targetCoords) to make a copy of the variable. Fixing problems like this in luajit is one of the hard tasks we still have to solve. What I'd really to to do is make it so that a = b has copy semantics if b is a "structure" (i.e. a Vec3, Coords, etc.).

This is caused by the logic in the movement code that gives you a little extra boost when you're running up a hill in jumping. Without the boost the jump feels very ineffective. The consequence is that jumping on a steep or nearly vertical slope gives you a big boost.

142. Q: Is there a way to have a child entity that does not rotate with it's parent, but still moves along with it? Other by manually rotating the child in the opposite direction of the parent.

Not at the moment, but one feature I've had in mind is make a child entity that doesn't inherit its parent's transform. This is something we could use to place the "ghost" cube for the Minecraft-like building without having the networking delay. This could be an extension to that (i.e. only inherit position, only inherit rotation, inherit full transform). What's your use case?

143. Q: Is there a way to have an object that is not visible to everyone? Think of cloaked skulks of waypoint breadcrumbs.

One way of doing this I've been considering is allowing the camera to include tags that affect what it renders. What do you think about that?

Additional Remarks to 123.:
Recently I have worked alot with moving child entities, and came to the conclusion that the local version like Self_GetLocalCoords (and its pendants for angles, positions and setters and getters) are the ones you almost always want. Considering how Bone_GetCoords already returns the local coordinates, I propose that the generic function like *_GetCoords, *_SetAngles, ... work in the local reference frame and specialized ones are added to access the global/absolute coordinates.

I came to the opposite conclusion (at least that if you didn't have an explicit reason to get the local coordinate frame, you wanted the global one) when I named them, but I'll take your feedback into consideration.

138. Bug:: I noticed that a function that is bound the to mousewheel (Action.Next) is always triggered twice. Here is some example code

This sounds like it's behaving properly and what you are seeing is the result of running the code on both the server and client. If you change it to print(World_GetName(), upcount) you should be able to see the two different sources. The same code may run on the client multiple times as well due to client side prediction, but before it runs each time it should reset upcount and thus produce the same result.

Ok that makes sense. I guess the proper questions is then, why the client side prediction and the server are so easily (and permanently) desynchronized even when client and server are on the same machine, and what I can do to syncronize them again.

139. Feature Request: "if bit.band(input.actions, Action.Next) ~= 0 then ..." is nice and all, but maybe there should be a high level function like IsPressed(Action.Next). While we are at it: when you want to query the state of a button outside of the OnInput function, you need to introduce a global variable and sync it with the input bitmask, why not have the current input state available globally at all times?

This has to do with the networking. It would probably make sense to introduce some more concise way of determining of a button is pressed, but adding a global function wouldn't make sense in all contexts. For example, say you have a script on an object which is not a player; what should the functions return in that case? I will give some consideration how this could be done in a way that doesn't lead to confusing behavior.

I did in no way propose to replace the bitmask with something else. I know why it is there and why it should stay there. All I said is, that having to use logical operations on bitmasks to get a button state is unnecessary complicated, is not very readable and hence makes the game a little bit less accessible. That's why there should be some higher level mechanism that hides the underlying bitmask.

But having to pass the input everytime, when it's the only thing you could legitimately pass to that function seems redundant, which is why I proposed to have the current keypresses in a global variable, and then have a global IsPressed(action) function. If no player is "attached" to an entity, the question if a certain key is pressed would of course always yield 'false'. If a player is attached, the global actions would be updated accordingly. However, this implies that only one player can control an entity at a time (which I assume but haven't checked yet).
If this is too limiting, then the current button states could be a property of the player (which is already carrying some data fields), and the call could be made more explicit:

if IsKeyPressed(playerId, Action.Next) then ... -- returns false if playerId<0

Yes you are right, this is a good catch. Another way to do it is like Coords(message.targetCoords) to make a copy of the variable. Fixing problems like this in luajit is one of the hard tasks we still have to solve. What I'd really to to do is make it so that a = b has copy semantics if b is a "structure" (i.e. a Vec3, Coords, etc.).

I was not aware there is a copy-constructor. Now I dont have to write a copy function to eliminate that unnecessary multiplications. Thanks.

This is caused by the logic in the movement code that gives you a little extra boost when you're running up a hill in jumping. Without the boost the jump feels very ineffective. The consequence is that jumping on a steep or nearly vertical slope gives you a big boost.

I dare to object.
To be honest, I hadn't checked the movement code before (because I am no longer using it). If I had, I would have seen the comment in the part you have mentioned, that the jumpBoost has a potential to be exploited, and wouldn't have made a bug report.
But while it probably has it's own problems, the jumpBoost is not the problem here!
The problem lies few lines above:

if jumpDesired or (now - timeLastJumpDesired) <= queuedJumpTime then

The OnInput function is executed continously (btw, Why?), and the second part (and isOnFloor) is true on multiple of those calls, which causes the queued jump to be added multiple times during 'queuedJumpTime'. Easy fix would be 'timeLastJumpDesired = -1' in the 'if isOnFloor' part (around line 210)

142. Q: Is there a way to have a child entity that does not rotate with it's parent, but still moves along with it? Other by manually rotating the child in the opposite direction of the parent.

Not at the moment, but one feature I've had in mind is make a child entity that doesn't inherit its parent's transform. This is something we could use to place the "ghost" cube for the Minecraft-like building without having the networking delay. This could be an extension to that (i.e. only inherit position, only inherit rotation, inherit full transform). What's your use case?

Well, a picture is worth a thousand words. Here are 60 pictures a second:

So I have my glider (body) and a camera (head). As the body is physics enabled, and you cannot have physics enabled child entities, the camera naturally is a child entity of the glider. Now when the body moves, the camera needs to follow. When the camera rotates, the body needs to follow. But as the camera is a child of the body, any rotation of the body also rotates the camera. As a result, the controls feel almost game-pad like. I tried to keep the camera steady by determining the current rotation of the body and that apply a counter rotation on the camera, but the results are mediocre (0:49-1:12). Ultimatly I would want the horizon line to stay fixed, which means the camera moves with the center of mass, but does not get any of the rotations.
The hiccups in the first 20 seconds during the zooming are caused by issue 138 btw.

Additional Remarks to 123.:
Recently I have worked alot with moving child entities, and came to the conclusion that the local version like Self_GetLocalCoords (and its pendants for angles, positions and setters and getters) are the ones you almost always want. Considering how Bone_GetCoords already returns the local coordinates, I propose that the generic function like *_GetCoords, *_SetAngles, ... work in the local reference frame and specialized ones are added to access the global/absolute coordinates.

I came to the opposite conclusion (at least that if you didn't have an explicit reason to get the local coordinate frame, you wanted the global one) when I named them, but I'll take your feedback into consideration.

Above, you have mentioned the minecraft block placing procedure, which made me thinking. Whether you require global or local coordinates most of the time may depend strongly on your use case, and no matter how you name the functions, there is always someone who will choose the wrong one on the first try.

144. Feature Request: Entity_GetChildByName(entityId, name)
Sure, I can use tags, but it feels dirty.

145. Bug: using_player.lua:
local highlightColor = Color(255, 0, 0, 255) --- Color
I am aware that Hud_HighlightEntity() is currently broken, so this doesn't matter, but this should be either Color(1.00, 0, 0, 1.00) or Color.red

146. Bug: for a physics enabled collision that is part of a player this code

147. Remark: When i make something a child of the player by using Self_SetParent(), that triggers OnCreate() in the Predict context, which was unexpected. Similarly when i detach the parent again, the OnDestroy method is called in the Predict context.

148. Remark: I needed a vector in the local coordinate system. The current way to do it is

local localVec = coords:GetInverse():TransformDirection(v)

which is fine. But since I only use cartesian coordinate systems, the axes are guaranteed to have length 1. So the above has some unneccessary multiplications and devisions, when effectivly I only need a simple matrix multiplication (matrix times vector):

149. Remark: (possibly bug)
When an object is inside a trigger area, changing the collision from Solid to Hitbox or Ghost to Hitbox triggers the Trigger (object leaves the area).
This is relevant for the game bounds (when setup in a way that everything is inside and destroyed on leave), as this effectivly means that nothing can be changed to Hitbox type (after creation), as this would immediately cause the destruction of the entity.

150. Remark:
have changed some values while the game was live. not sure what exactly happend, but this caused some asserts at first and then the game crashed. when i tried to load my mod, the assertion errors returned (havent kept a copy). turns out the collision mesh for the object i had edited at last was no longer in the asset browser. I cleared the roaming/FuturePerfect directory to force a rebuild of the collsion mesh, but it didn't work. In the end, I had to delete to following lines in the .build_options file of the model, after that it everything was generated.

152. Remark: Observed multiple times now, that when someone tries to join my game while I am on the beta channel and he is not, he will download a lot of stuff (expected) but then time out. I am not too woried if betas cannot join non-betas, but maybe the timeout doesn't take ongoing downloads into account.

We are still deciding on the name thing. It may be a can of worms as we may need to add a lot more of these types of name query functions if we add that one. Names were intended as a debugging mechanism more than anything.

147. Is this creating a problem for you or just seems wrong? These objects are being created/destroyed in the prediction world but this should maybe be hidden from scripts.

No, not a problem at all. Had attached some messages to the creation/destruction events and was surprised of the addtional outputs. But all the calls stay in the predict context, so they don't matter. I make it my habit now to always print World_GetName() with everything. Helps to understand such outputs:

153. Remark: Documentation should say that World_TestRayOverlap(origin, direction, distance, filter) assumes a normalized direction. I used the current velocity as direction and it took me some time to realize that direction * distance is used.

154. Feature Request: Does Self_GetComponent("Camera") need to be case sensitive? Why even strings when all the componentsTypes are already listed, i.e. ComponentType.Camera?

155. Feature Request: Entity_GetIsValid(nil) should not throw an error, so i can shorten these lines:

if target ~= nil and Entity_GetIsValid(target) then

Also, I had the special case where the argument was a valid Id in the server context, but nil in the predict context.

156. Remark: Short time of confusion until I realised that Camera_SetFov takes radians. Maybe documentation should mention that.

157. Remark: I want to know if I hit a "Ramp".
As I cannot check for the name (#102, #144), I gave every ramp a tag and then checked for that

ramp_01_a is a child of "Ramp", so it does not inherit it's tag. I ended up writing a function that recursivly checks all parents for tags.
Of course I am not suggesting that children should inherit the tags of their parents, but maybe there is a more elegant solution.

158. Bug: The World_EndGame() overlay is on top of the entity editor

159. Bug: The only method to unset an entity field such as the "attach to" field is to drop it against the background. Kind of difficult to do from the inside of a room Edit: Backspace works fine

160. Feature Request: on grid increase/decrease also show the snapsize for angles

161. Bug: add script
select script field
type "creat"
drop "add force on create" into the script field
select script field
type "creat"
drop "create player on destroy" into the script field
-> height of "offset distance" field is wrong
(not always reproducable)

162. Bug: add any script to an entity. select the script field and drop "add score on activate" instead. notice how the default score is 0, although it is 1 in the script. works with any script.

163. Bug: create_player_on_destroy.lua:
not changing offsets, will produce errors:
Entity position set to a non-finite value
Entity angles set to a non-finite value
here is why:

168. Remark: playerspawners for two teams (in two different spawnGroups) dont handle playerJoin (a player is spawned in each spawnGroup), and therefore need to ignore playerJoin and have a central instance manage all player assignments. Maybe I misunderstand the spawnGroup concept here.
Also on player death a "Dead Player" is spawned, that does not inherit the spawnGroup of the destroyed avatar, hence that information is lost.

169. Q: There is OnPlayerJoin. Is there a similar call once a player leaves? I want to maintain a list of all connected players, so i can decide which team new players should be assigned to. (yes, I could check if playerIds are valid everytime i use them)

170. Q: Action.128 = "Drop" <- for what is this field useful? Isn't Action.Drop = 128 all that is ever needed?<br>
171. Remark: I am slowly running out of assignable actions. There are 19 actions, as far as I understand there is room for 13 (45?) more.

172. Bug: Self_SetParent() vs client prediction
When I catch an object, I run this code on the object:

Collision_SetFilter(collisionId, CollisionFilterPreset.Ghost)
Collision_SetPhysics(collisionId, false)
Self_SetParent(message.catcher) -- message.catcher is the player

Note how I shoot in x-direction (world coordinates) and for ~1 frame the puck appears in x-direction in the local coordinates of the player.
Both, the player and the puck are physics-enabled.
Is there anything I can do to prevent this?

0Mat is the texture name that comes right out of MagicaVoxel and if leading numbers are not allowed I need to edit the fbx file, which I would like to avoid. I also believe the error is new, never noticed it before.

174. Remark: I have an entity with 2 Scripts. One has the OnSetText() function, the other one looks like this:

Is EntityId_ToString doing something special? No issues if World_Raycast is used instead of World_TestRayOverlap. Should I always make a local copy if I use structs that are passed from other functions? What about this one:

timedcallback(1, function() Unstuck(hit.entityId, 1) end)

Unstuck recieves another id than the calling function was sending. Are entityIds structs? I thought they were integers interpreted as doubles?

159. You can select the field by clicking on it and then press the backspace key.

160. Good idea. Added a card.

161. Reproduced. Added a card. I noticed you can deselect the entity and reselect to "fix" this problem.

162. I have noticed this type of thing myself in the past but haven't been able to figure out the repro steps. This didn't do it for me. I tried in the blueprint editor so maybe you have other steps.

163. Fixed. Thanks!

164. Added a card.

165. Hmm, a tricky one! We will have to figure something out.

166. I know what you mean. Added a card.

167. I cleaned up that code. Entity_AddForce exists because it is a very common operation and we didn't want to require every object in the world to have a script to allow forces to be applied. It doesn't break encapsulation that much since force can already be applied to another entity by moving into it.

168. The team spawning code is pretty old and I was never happy with it. Perhaps I should just remove it for now? It would probably be better to have a dedicated "team spawner" script rather than trying to reuse the existing one.

169. There currently is not. I can't think why there shouldn't be so I have added a card to add OnPlayerLeave.

170. I can't find the code right now but I believe the code that generates those automatically fills the table in reverse too. It lets you convert from the code to the name.

171. There is a limit right now. We didn't intend to add a bunch more keys but if you can make a good argument we will of course listen.

172. Hard to tell really what is going on here. Do you set the position of the puck at some point after the code you posted?

173. This was recently fixed. I was using MagicaVoxel too

174. The first play sound causes the sound entity to be attached to the entity. Then in your SetText message receiver you destroy all the children. So the sound entity is a child of your child and is also destroyed. You can add a delay to avoid this with timedcallback perhaps.

175. haha, SoundType.Max is not really supposed to be exposed (not exposed in the UI for instance). It just denotes the number of items in our enum. Ambient and Effect are the only 2 types right now.

176. This is the correct way.

177. Fixed. Thanks!

Entity Ids are structs since an entity can stop existing while something is holding a reference. We update the entity Ids automatically to null them out in this case.

168. The team spawning code is pretty old and I was never happy with it. Perhaps I should just remove it for now? It would probably be better to have a dedicated "team spawner" script rather than trying to reuse the existing one.

Can't tell. The team spawners are certainly not easy to use right now, but it is possible to make them work (e.g. I use them). Probably best to leave them until they get replaced.

I think it is important here that the object to catch is physics enabled and the catching entity is the player. The faulty location is the global coordinates (in the video: +16 in z direction) added relative to the player in his reference frame.