#!/usr/bin/env python3 """Compare LivingEntity water/lava travel and fluid velocity updates with vanilla.""" import argparse import json import os from pathlib import Path import platform import subprocess import random import struct import math try: from . import lab, test_rust_parity as base except ImportError: import lab import test_rust_parity as base def corpus(): def bits(v):return struct.pack('>d',float(v)).hex() def single(v):return struct.pack('>f',float(v)).hex() def row(**kw): f=dict(mode='fluid',input=[.4,0,.8],velocity=[.1,-.08,-.2],after_velocity=[.3,-.6,.9],fall=6,friction=.6,friction_modifier=1,drag_modifier=1,speed=.1,flying_speed=.02,yaw=37,ground=[True,True],climb=[False,False],scaffolding=False,suppress=False,player=False,horizontal=False,jumping=False,snow=False,after_horizontal=False,after_jumping=False,after_snow=False,powder_tag=False,boots=False,levitation=None,client=False,chunk=True,gravity=.08,y=64,min_y=-64,discard=False,omni=False,yaw_mutate=False,move_mutate=False,fail=-1) f.update(water=True,sprint=[False],slow_down=.8,efficiency=0,dolphin=False,lava_height=1,floatable_height=0,threshold=.4,free=False,vehicle=False,float_tag=False,free_mutate=False,falling=True,old_y=64,after_y=64) f.update(kw) for k in ['input','velocity','after_velocity']:f[k]=[bits(v) for v in f[k]] for k in ['fall','friction_modifier','drag_modifier','gravity','y','efficiency','lava_height','floatable_height','threshold','old_y','after_y']:f[k]=bits(f[k]) for k in ['friction','speed','flying_speed','yaw','slow_down']:f[k]=single(f[k]) return f vals=[-float('inf'),-1e30,-1,-.15,-.003,-1e-40,-0.0,0,1e-40,.002,.003,.005,.008,.08,.15,.6,.91,.98,1,2,1e30,float('inf'),float('nan')] for gravity in vals: for y in vals+[math.nextafter(.002,0),math.nextafter(.002,1),math.nextafter(.008,0),math.nextafter(.008,1)]: for falling in [False,True]: for sprint in [False,True]:yield row(mode='adjust',input=[-0.0,y,float('nan')],gravity=gravity,falling=falling,sprint=[sprint]) for efficiency in vals: for slowdown in vals: for ground in [False,True]: for dolphin in [False,True]: for sprint in [[False],[True],[False,True],[True,False]]:yield row(mode='water',efficiency=efficiency,slow_down=slowdown,ground=[ground],dolphin=dolphin,sprint=sprint) for height in vals: for threshold in vals: for gravity in [-0.0,.08,float('nan')]: for falling in [False,True]:yield row(mode='lava',lava_height=height,threshold=threshold,gravity=gravity,falling=falling,move_mutate=True) for mode in ['water','lava','fluid','jump','float']: for mask in range(256): f={k:bool(mask&(1<