dbody entity key refactor
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				studiorailgun/Renderer/pipeline/head This commit looks good
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	studiorailgun/Renderer/pipeline/head This commit looks good
				
			This commit is contained in:
		
							parent
							
								
									3082dde1b1
								
							
						
					
					
						commit
						5fce9bc292
					
				| @ -11,6 +11,7 @@ import org.joml.Vector3i; | ||||
| import electrosphere.client.terrain.cache.ChunkData; | ||||
| import electrosphere.client.terrain.cells.DrawCell.DrawCellFace; | ||||
| import electrosphere.client.terrain.manager.ClientTerrainManager; | ||||
| import electrosphere.collision.PhysicsEntityUtils; | ||||
| import electrosphere.engine.Globals; | ||||
| import electrosphere.entity.EntityUtils; | ||||
| import electrosphere.net.parser.net.message.TerrainMessage; | ||||
| @ -76,7 +77,7 @@ public class DrawCellManager { | ||||
|      | ||||
|     //the real-space radius for which we will construct draw cells inside of | ||||
|     //ie, we check if the draw cell's entity would be inside this radius. If it would, create the draw cell, otherwise don't | ||||
|     double drawFullModelRadius = 50; | ||||
|     double drawFullModelRadius = 70; | ||||
| 
 | ||||
|     //the radius we'll draw LODed chunks for | ||||
|     double drawLODRadius = drawFullModelRadius + ServerTerrainChunk.CHUNK_DIMENSION * (2*2 + 4*4 + 8*8 + 16*16); | ||||
| @ -501,7 +502,7 @@ public class DrawCellManager { | ||||
|             return false; | ||||
|         } | ||||
|         DrawCell cell = this.keyCellMap.get(key); | ||||
|         return cell.modelEntity != null; | ||||
|         return cell.modelEntity != null && PhysicsEntityUtils.getDBody(cell.modelEntity) != null; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -623,8 +623,8 @@ public class CollisionEngine { | ||||
|      */ | ||||
|     public void destroyPhysics(Entity e){ | ||||
|         //make uncollidable | ||||
|         if(e.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY)){ | ||||
|             DBody rigidBody = (DBody)e.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|         if(PhysicsEntityUtils.containsDBody(e)){ | ||||
|             DBody rigidBody = PhysicsEntityUtils.getDBody(e); | ||||
|             deregisterCollisionObject(rigidBody,PhysicsEntityUtils.getCollidable(e)); | ||||
|             e.removeData(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|             deregisterPhysicsObject(rigidBody); | ||||
|  | ||||
| @ -50,7 +50,7 @@ public class PhysicsEntityUtils { | ||||
|                 ); | ||||
|                 collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); | ||||
|                 ClientCollidableTree tree = new ClientCollidableTree(rVal,collidable,rigidBody); | ||||
|                 rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); | ||||
|                 PhysicsEntityUtils.setDBody(rVal,rigidBody); | ||||
|                 Matrix4d offsetTransform = new Matrix4d().translationRotate( | ||||
|                     physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate | ||||
|                     physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW() //rotate | ||||
| @ -76,7 +76,7 @@ public class PhysicsEntityUtils { | ||||
|                 ); | ||||
|                 collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); | ||||
|                 ClientCollidableTree tree = new ClientCollidableTree(rVal,collidable,rigidBody); | ||||
|                 rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); | ||||
|                 PhysicsEntityUtils.setDBody(rVal,rigidBody); | ||||
|                 Matrix4d offsetTransform = new Matrix4d().translationRotateScale( | ||||
|                     physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate | ||||
|                     physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW(), //rotate | ||||
| @ -128,7 +128,7 @@ public class PhysicsEntityUtils { | ||||
|                 ); | ||||
|                 collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); | ||||
|                 ServerCollidableTree tree = new ServerCollidableTree(rVal,collidable,rigidBody); | ||||
|                 rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); | ||||
|                 PhysicsEntityUtils.setDBody(rVal,rigidBody); | ||||
|                 Matrix4d offsetTransform = new Matrix4d().translationRotateScale( | ||||
|                     physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate | ||||
|                     physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW(), //rotate | ||||
| @ -151,7 +151,7 @@ public class PhysicsEntityUtils { | ||||
|                 rigidBody = CollisionBodyCreation.createCubeBody(realm.getCollisionEngine(),new Vector3d(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3()),Collidable.TYPE_CREATURE_BIT); | ||||
|                 collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); | ||||
|                 ServerCollidableTree tree = new ServerCollidableTree(rVal,collidable,rigidBody); | ||||
|                 rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); | ||||
|                 PhysicsEntityUtils.setDBody(rVal,rigidBody); | ||||
|                 Matrix4d offsetTransform = new Matrix4d().translationRotateScale( | ||||
|                     physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate | ||||
|                     physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW(), //rotate | ||||
| @ -248,7 +248,7 @@ public class PhysicsEntityUtils { | ||||
|         DBody body = collisionEngine.createDBody(triMesh); | ||||
| 
 | ||||
|         Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(body, new Collidable(terrain,Collidable.TYPE_TERRAIN, false)); | ||||
|         terrain.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, body); | ||||
|         PhysicsEntityUtils.setDBody(terrain,body); | ||||
| 
 | ||||
|         return body; | ||||
|     } | ||||
| @ -267,7 +267,7 @@ public class PhysicsEntityUtils { | ||||
|          | ||||
|          | ||||
|         Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(terrainBody, new Collidable(terrain,Collidable.TYPE_TERRAIN, false)); | ||||
|         terrain.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, terrainBody); | ||||
|         PhysicsEntityUtils.setDBody(terrain,terrainBody); | ||||
|          | ||||
|         return terrainBody; | ||||
|     } | ||||
| @ -286,7 +286,7 @@ public class PhysicsEntityUtils { | ||||
|         CollisionBodyCreation.setGravityMode(terrainRealm.getCollisionEngine(), terrainBody, false); | ||||
|          | ||||
|         terrainRealm.getCollisionEngine().registerCollisionObject(terrainBody, new Collidable(terrain,Collidable.TYPE_TERRAIN, false)); | ||||
|         terrain.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, terrainBody); | ||||
|         PhysicsEntityUtils.setDBody(terrain,terrainBody); | ||||
|          | ||||
|         return terrainBody; | ||||
|     } | ||||
| @ -300,6 +300,24 @@ public class PhysicsEntityUtils { | ||||
|         return (Matrix4d) entity.getData(EntityDataStrings.PHYSICS_COLLISION_BODY_TRANSFORM); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Checks if the entity contains a dbody | ||||
|      * @param entity the entity | ||||
|      * @return true if contains, false otherwise | ||||
|      */ | ||||
|     public static boolean containsDBody(Entity entity){ | ||||
|         return entity.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Sets the dbody on the entity | ||||
|      * @param entity The entity | ||||
|      * @param body The body | ||||
|      */ | ||||
|     public static void setDBody(Entity entity, DBody body){ | ||||
|         entity.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, body); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Gets the DBody attached to an entity | ||||
|      * @param entity the entity | ||||
|  | ||||
| @ -6,6 +6,7 @@ import java.util.LinkedList; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import electrosphere.collision.PhysicsEntityUtils; | ||||
| import electrosphere.engine.Globals; | ||||
| import electrosphere.entity.Entity; | ||||
| import electrosphere.entity.EntityCreationUtils; | ||||
| @ -151,7 +152,7 @@ public class ClientEquipState implements BehaviorTree { | ||||
|                             ); | ||||
|                         } | ||||
|                         //make uncollidable | ||||
|                         if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|                         if(PhysicsEntityUtils.containsDBody(toEquip) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|                             Globals.clientSceneWrapper.getCollisionEngine().destroyPhysics(toEquip); | ||||
|                         } | ||||
|                         //hide toEquip actor | ||||
| @ -190,7 +191,7 @@ public class ClientEquipState implements BehaviorTree { | ||||
|                         AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson()) | ||||
|                     ); | ||||
|                 } | ||||
|                 if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|                 if(PhysicsEntityUtils.containsDBody(toEquip) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|                     Globals.clientSceneWrapper.getCollisionEngine().destroyPhysics(toEquip); | ||||
|                 } | ||||
|                 Globals.clientSceneWrapper.getScene().removeEntityFromTag(toEquip, EntityTags.TARGETABLE); | ||||
|  | ||||
| @ -10,6 +10,7 @@ import java.util.Map; | ||||
| 
 | ||||
| import org.joml.Vector3d; | ||||
| 
 | ||||
| import electrosphere.collision.PhysicsEntityUtils; | ||||
| import electrosphere.engine.Globals; | ||||
| import electrosphere.entity.Entity; | ||||
| import electrosphere.entity.EntityDataStrings; | ||||
| @ -125,7 +126,7 @@ public class ServerEquipState implements BehaviorTree { | ||||
|                             AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()) | ||||
|                         ); | ||||
|                         //make uncollidable | ||||
|                         if(inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|                         if(PhysicsEntityUtils.containsDBody(inWorldItem) && inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|                             Realm inWorldRealm = Globals.realmManager.getEntityRealm(inWorldItem); | ||||
|                             inWorldRealm.getCollisionEngine().destroyPhysics(inWorldItem); | ||||
|                         } | ||||
| @ -146,7 +147,7 @@ public class ServerEquipState implements BehaviorTree { | ||||
|                     AttachUtils.getEquipPointVectorOffset(point.getOffsetVectorThirdPerson()), | ||||
|                     AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()) | ||||
|                 ); | ||||
|                 if(inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|                 if(PhysicsEntityUtils.containsDBody(inWorldItem) && inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|                     Realm inWorldRealm = Globals.realmManager.getEntityRealm(inWorldItem); | ||||
|                     inWorldRealm.getCollisionEngine().destroyPhysics(inWorldItem); | ||||
|                 } | ||||
|  | ||||
| @ -7,6 +7,7 @@ import org.ode4j.ode.DBody; | ||||
| 
 | ||||
| import electrosphere.collision.CollisionBodyCreation; | ||||
| import electrosphere.collision.CollisionEngine; | ||||
| import electrosphere.collision.PhysicsEntityUtils; | ||||
| import electrosphere.collision.PhysicsUtils; | ||||
| import electrosphere.collision.collidable.Collidable; | ||||
| import electrosphere.engine.Globals; | ||||
| @ -237,7 +238,7 @@ public class CollisionObjUtils { | ||||
|         Collidable collidable = new Collidable(entity, collidableType, true); | ||||
|         Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(collisionObject, collidable); | ||||
| 
 | ||||
|         entity.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, collisionObject); | ||||
|         PhysicsEntityUtils.setDBody(entity, collisionObject); | ||||
| 
 | ||||
|         //update world transform of collision object | ||||
|         clientPositionCharacter(entity,position,rotation); | ||||
| @ -261,7 +262,7 @@ public class CollisionObjUtils { | ||||
|         Realm realm = Globals.realmManager.getEntityRealm(entity); | ||||
|         realm.getCollisionEngine().registerCollisionObject(collisionObject, collidable); | ||||
| 
 | ||||
|         entity.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, collisionObject); | ||||
|         PhysicsEntityUtils.setDBody(entity, collisionObject); | ||||
| 
 | ||||
|         //update world transform of collision object | ||||
|         serverPositionCharacter(entity,position); | ||||
| @ -271,14 +272,10 @@ public class CollisionObjUtils { | ||||
|         entity.putData(EntityDataStrings.PHYSICS_MASS, mass); | ||||
|     } | ||||
|      | ||||
|     public static DBody getCollisionBody(Entity e){ | ||||
|         return (DBody)e.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|     } | ||||
|      | ||||
|     public static void serverPositionCharacter(Entity e, Vector3d position){ | ||||
|         EntityUtils.getPosition(e).set(position); | ||||
|         Quaterniond rotation = EntityUtils.getRotation(e); | ||||
|         DBody body = getCollisionBody(e); | ||||
|         DBody body = PhysicsEntityUtils.getDBody(e); | ||||
|         CollisionEngine collisionEngine = Globals.realmManager.getEntityRealm(e).getCollisionEngine(); | ||||
|         if(body != null){ | ||||
|             PhysicsUtils.setRigidBodyTransform(collisionEngine, position, rotation, body); | ||||
| @ -287,7 +284,7 @@ public class CollisionObjUtils { | ||||
| 
 | ||||
|     public static void clientPositionCharacter(Entity e, Vector3d position, Quaterniond rotation){ | ||||
|         EntityUtils.getPosition(e).set(position); | ||||
|         DBody body = getCollisionBody(e); | ||||
|         DBody body = PhysicsEntityUtils.getDBody(e); | ||||
|         if(body != null){ | ||||
|             PhysicsUtils.setRigidBodyTransform(Globals.clientSceneWrapper.getCollisionEngine(), position, rotation, body); | ||||
|         } | ||||
|  | ||||
| @ -239,7 +239,7 @@ public class CreatureUtils { | ||||
|                 } break; | ||||
|                 case "GRAVITY": | ||||
|                     Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); | ||||
|                     DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|                     DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); | ||||
|                     ClientGravityTree.attachTree(rVal, collidable, collisionObject, 30); | ||||
|                     rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); | ||||
|                     break; | ||||
| @ -527,7 +527,7 @@ public class CreatureUtils { | ||||
|                 } break; | ||||
|                 case "GRAVITY": { | ||||
|                     Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); | ||||
|                     DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|                     DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); | ||||
|                     ServerGravityTree.attachTree(rVal, collidable, collisionObject, 30); | ||||
|                     rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); | ||||
|                 } break; | ||||
|  | ||||
| @ -68,7 +68,7 @@ public class ItemUtils { | ||||
|             switch(token){ | ||||
|                 case "GRAVITY": | ||||
|                     Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); | ||||
|                     DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|                     DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); | ||||
|                     ClientGravityTree.attachTree(rVal, collidable, collisionObject, 30); | ||||
|                     rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); | ||||
|                     break; | ||||
| @ -147,7 +147,7 @@ public class ItemUtils { | ||||
|             switch(token){ | ||||
|                 case "GRAVITY": | ||||
|                     Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); | ||||
|                     DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|                     DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); | ||||
|                     ServerGravityTree.attachTree(rVal, collidable, collisionObject, 30); | ||||
|                     rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); | ||||
|                     break; | ||||
| @ -449,7 +449,7 @@ public class ItemUtils { | ||||
|     public static void clientDestroyInWorldItem(Entity item){ | ||||
|         if(isItem(item)){ | ||||
|             //destroy physics | ||||
|             if(item.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && item.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|             if(PhysicsEntityUtils.containsDBody(item) && item.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ | ||||
|                 //destroy physics | ||||
|                 //this deregisters from all four & unhooks rigid bodies from the physics runtime | ||||
|                 Globals.clientSceneWrapper.getCollisionEngine().destroyPhysics(item); | ||||
|  | ||||
| @ -86,7 +86,7 @@ public class ObjectUtils { | ||||
|             switch(token){ | ||||
|                 case "GRAVITY": | ||||
|                     Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); | ||||
|                     DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|                     DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); | ||||
|                     ClientGravityTree.attachTree(rVal, collidable, collisionObject, 30); | ||||
|                     rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); | ||||
|                     break; | ||||
| @ -173,7 +173,7 @@ public class ObjectUtils { | ||||
|             switch(token){ | ||||
|                 case "GRAVITY": | ||||
|                     Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); | ||||
|                     DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); | ||||
|                     DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); | ||||
|                     ServerGravityTree.attachTree(rVal, collidable, collisionObject, 30); | ||||
|                     rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); | ||||
|                     break; | ||||
|  | ||||
| @ -17,6 +17,7 @@ import org.joml.Vector4f; | ||||
| import org.ode4j.ode.DBody; | ||||
| 
 | ||||
| import electrosphere.collision.CollisionBodyCreation; | ||||
| import electrosphere.collision.PhysicsEntityUtils; | ||||
| import electrosphere.collision.collidable.Collidable; | ||||
| import electrosphere.engine.Globals; | ||||
| import electrosphere.entity.Entity; | ||||
| @ -119,7 +120,7 @@ public class ProceduralTree { | ||||
|         CollisionBodyCreation.setOffsetPosition(Globals.clientSceneWrapper.getCollisionEngine(), rigidBody, new Vector3d(0,treeModel.getPhysicsBody().getOffsetY(),0)); | ||||
|         CollisionBodyCreation.setKinematic(Globals.clientSceneWrapper.getCollisionEngine(), rigidBody); | ||||
|         Collidable collidable = new Collidable(trunkChild, Collidable.TYPE_FOLIAGE_STATIC, true); | ||||
|         trunkChild.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); | ||||
|         PhysicsEntityUtils.setDBody(trunkChild, rigidBody); | ||||
|         Matrix4d offsetTransform = new Matrix4d().translationRotateScale( | ||||
|             0,treeModel.getPhysicsBody().getOffsetY(),0, //translate | ||||
|             0,0,0,1, //rotate | ||||
| @ -385,7 +386,7 @@ public class ProceduralTree { | ||||
|         CollisionBodyCreation.setOffsetPosition(realm.getCollisionEngine(), rigidBody, new Vector3d(0,treeModel.getPhysicsBody().getOffsetY(),0)); | ||||
|         CollisionBodyCreation.setKinematic(realm.getCollisionEngine(), rigidBody); | ||||
|         Collidable collidable = new Collidable(trunkChild, Collidable.TYPE_FOLIAGE_STATIC, true); | ||||
|         trunkChild.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); | ||||
|         PhysicsEntityUtils.setDBody(trunkChild, rigidBody); | ||||
|         Matrix4d offsetTransform = new Matrix4d().translationRotateScale( | ||||
|             0,treeModel.getPhysicsBody().getOffsetY(),0, //translate | ||||
|             0,0,0,1, //rotate | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user