/// <summary> /// Warp etntiy to position /// </summary> /// <param name="id"></param> /// <param name="v"></param> public void Warp(Position targetPosition, bool instantUpdate = false) { RoomTile oldTile = CurrentTile; if (oldTile != null) { oldTile.RemoveEntity(Entity); } if (Next != null) { RoomTile nextTile = Next.GetTile(Room); if (nextTile != null) { nextTile.RemoveEntity(Entity); } } Position = targetPosition.Copy(); RefreshHeight(targetPosition); RoomTile newTile = CurrentTile; if (newTile != null) { newTile.AddEntity(Entity); } if (instantUpdate && Room != null) { InteractItem(); Room.Send(new UsersStatusComposer(List.Create(Entity))); } }
/// <summary> /// Process user inside room /// </summary> /// <param name="entity">the entity to process</param> private void ProcessUser(IEntity entity) { Position position = entity.RoomEntity.Position; Position goal = entity.RoomEntity.Goal; if (entity.RoomEntity.IsWalking) { if (entity.RoomEntity.Next != null) { entity.RoomEntity.Position.X = entity.RoomEntity.Next.X; entity.RoomEntity.Position.Y = entity.RoomEntity.Next.Y; entity.RoomEntity.Position.Z = entity.RoomEntity.Position.GetTile(room).GetWalkingHeight(); } if (entity.RoomEntity.PathList.Count > 0) { Position next = entity.RoomEntity.PathList[0]; entity.RoomEntity.PathList.Remove(next); var previousTile = entity.RoomEntity.CurrentTile; if (previousTile != null) { previousTile.RemoveEntity(entity); } RoomTile nextTile = next.GetTile(room); if (nextTile == null || !RoomTile.IsValidTile(room, entity, next, lastStep: !entity.RoomEntity.PathList.Any())) { entity.RoomEntity.PathList.Clear(); ProcessUser(entity); entity.RoomEntity.Move(goal.X, goal.Y); return; } nextTile.AddEntity(entity); int rotation = Rotation.CalculateDirection(position.X, position.Y, next.X, next.Y); double height = next.GetTile(room).GetWalkingHeight(); entity.RoomEntity.RemoveStatus("mv"); entity.RoomEntity.RemoveStatus("sit"); entity.RoomEntity.RemoveStatus("lay"); entity.RoomEntity.Position.Rotation = rotation; entity.RoomEntity.AddStatus("mv", string.Format("{0},{1},{2}", next.X, next.Y, height.ToClientValue())); entity.RoomEntity.Next = next; } else { entity.RoomEntity.StopWalking(); } entity.RoomEntity.NeedsUpdate = true; } }
public void DoRoll(IEntity entity, Item roller, Room room, Position fromPosition, Position nextPosition) { RoomTile previousTile = fromPosition.GetTile(room); RoomTile nextTile = nextPosition.GetTile(room); // Temporary fix if the user walks on an item and their height gets put up. if (entity.RoomEntity.CurrentItem != null && entity.RoomEntity.CurrentItem.Definition.HasBehaviour(ItemBehaviour.ROLLER)) { if (Math.Abs(entity.RoomEntity.Position.Z - roller.Position.Z) >= 0.1) { if (nextTile.HighestItem != null && nextTile.HighestItem.Definition.HasBehaviour(ItemBehaviour.ROLLER)) { nextPosition.Z = roller.Position.Z + roller.Definition.Data.TopHeight; } } } // The next height but what the client sees. double displayNextHeight = nextPosition.Z; //if (entity.getRoomUser().isSittingOnGround()) //{ // displayNextHeight -= 0.5; // Take away sit offset when sitting on ground, because yeah, weird stuff. //} entity.RoomEntity.RollingData.DisplayHeight = displayNextHeight;//setZ(displayNextHeight); entity.RoomEntity.Position.X = nextPosition.X; entity.RoomEntity.Position.Y = nextPosition.Y; entity.RoomEntity.Position.Z = nextPosition.Z; previousTile.RemoveEntity(entity); nextTile.AddEntity(entity); /* * * * // Fix bounce for sitting on chairs if the chair top height is higher 1.0 * if (entity.getRoomUser().containsStatus(StatusType.SIT)) { * double sitHeight = Double.parseDouble(entity.getRoomUser().getStatus(StatusType.SIT).getValue()); * * if (sitHeight > 1.0) { * displayNextHeight += (sitHeight - 1.0); // Add new height offset found. * } * } * * entity.getRoomUser().getRollingData().setDisplayHeight(displayNextHeight);//setZ(displayNextHeight); * * entity.getRoomUser().getPosition().setX(nextPosition.getX()); * entity.getRoomUser().getPosition().setY(nextPosition.getY()); * entity.getRoomUser().getPosition().setZ(nextPosition.getZ()); * * previousTile.removeEntity(entity); * nextTile.addEntity(entity);*/ }