Context
Making a mod that causes items to float in liquid. Just thought you could use a heads up on this logic error.
Note: Just want to be extra clear that this is a bug with the vanilla game, not a mod.
Bug
It's very minor but potentially difficult to find. The issue is with Grid.IsVisiblyInLiquid - at least in the disassembly, we have this snippet if the cell above is not a liquid:
float num2 = Mass[num]; float num3 = (float)(int)pos.y - pos.y; if (num2 / 1000f <= num3) { return true; }
The problem is when taking the precision out of pos, we're left with a negative number, so this condition becomes impossible to fulfill. I think the purpose of this was to check how much of a fraction the mass of the tile was liquid, and return true if it is below that fraction.
Illustration:
pos.y = 58.918 (float)(int)pos.y - pos.y = (float)(int)58.918 - 58.918 = 58 - 58.918 = -0.918
Sample values logged through a copy of this function in gravity simulation:
y: 178.823, num3: -0.823 y: 173.825, num3: -0.825 y: 173.930, num3: -0.930 y: 173.884, num3: -0.884 y: 173.885, num3: -0.885 y: 230.935, num3: -0.935 y: 173.824, num3: -0.824 y: 58.918, num3: -0.918
Fix
I believe the ideal logic would be
float num3 = pos.y - Mathf.Floor(pos.y);
EDIT: After testing, the comparison should be negated, it should be greater than, not less than or equals, since we want to see if the quantity of water is greater than the position we're checking.
Call Grid.IsVisiblyInLiquid with debug log line.
There are no comments to display.
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now