public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } spriteToDraw = GetSprite(pManager.CurrentBaseSpriteKey); mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); var bounds = spriteToDraw.GetLocalBounds(); var spriteSize = CluwneLib.PixelToTile(new Vector2f(bounds.Width, bounds.Height)); var spriteRectWorld = new FloatRect(mouseWorld.X - (spriteSize.X / 2f), mouseWorld.Y - (spriteSize.Y / 2f), spriteSize.X, spriteSize.Y); currentTile = currentMap.GetTileRef(mouseWorld); //if (currentMap.IsSolidTile(mouseWorld)) validPosition = false; var rangeSquared = pManager.CurrentPermission.Range * pManager.CurrentPermission.Range; if (rangeSquared > 0) { if ( (pManager.PlayerManager.ControlledEntity.GetComponent <TransformComponent>(ComponentFamily.Transform) .Position - mouseWorld).LengthSquared() > rangeSquared) { return(false); } } if (pManager.CurrentPermission.IsTile) { mouseWorld = new Vector2f(currentTile.X + 0.5f, currentTile.Y + 0.5f); mouseScreen = CluwneLib.WorldToScreen(mouseWorld).Round(); } else { mouseWorld = new Vector2f(currentTile.X + 0.5f + pManager.CurrentTemplate.PlacementOffset.Key, currentTile.Y + 0.5f + pManager.CurrentTemplate.PlacementOffset.Value); mouseScreen = CluwneLib.WorldToScreen(mouseWorld).Round(); spriteRectWorld = new FloatRect(mouseWorld.X - (bounds.Width / 2f), mouseWorld.Y - (bounds.Height / 2f), bounds.Width, bounds.Height); if (pManager.CollisionManager.IsColliding(spriteRectWorld)) { return(false); } //Since walls also have collisions, this means we can't place objects on walls with this mode. } return(true); }
public bool CheckCollision() { var drawsprite = GetSprite(pManager.CurrentBaseSpriteKey); var bounds = drawsprite.GetLocalBounds(); var spriteSize = CluwneLib.PixelToTile(new Vector2(bounds.Width, bounds.Height)); var spriteRectWorld = Box2.FromDimensions(mouseWorld.X - (spriteSize.X / 2f), mouseWorld.Y - (spriteSize.Y / 2f), spriteSize.X, spriteSize.Y); if (pManager.CollisionManager.IsColliding(spriteRectWorld)) { return(false); } return(true); }
public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } spriteToDraw = GetDirectionalSprite(pManager.CurrentBaseSpriteKey); mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); var bounds = spriteToDraw.GetLocalBounds(); var spriteSize = CluwneLib.PixelToTile(new Vector2f(bounds.Width, bounds.Height)); var spriteRectWorld = new FloatRect(mouseWorld.X - (spriteSize.X / 2f), mouseWorld.Y - (spriteSize.Y / 2f), spriteSize.X, spriteSize.Y); if (pManager.CurrentPermission.IsTile) { return(false); } if (pManager.CollisionManager.IsColliding(spriteRectWorld)) { return(false); } //if (currentMap.IsSolidTile(mouseWorld)) return false; var rangeSquared = pManager.CurrentPermission.Range * pManager.CurrentPermission.Range; if (rangeSquared > 0) { if ( (pManager.PlayerManager.ControlledEntity.GetComponent <TransformComponent>(ComponentFamily.Transform) .Position - mouseWorld).LengthSquared() > rangeSquared) { return(false); } } currentTile = currentMap.GetTileRef(mouseWorld); return(true); }
public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } spriteToDraw = GetDirectionalSprite(pManager.CurrentBaseSpriteKey); mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); var bounds = spriteToDraw.GetLocalBounds(); var spriteSize = CluwneLib.PixelToTile(new Vector2f(bounds.Width, bounds.Height)); if (pManager.CurrentPermission.IsTile) { return(false); } currentTile = currentMap.GetTileRef(mouseWorld); if (!currentTile.Tile.TileDef.IsWall) { return(false); } var rangeSquared = pManager.CurrentPermission.Range * pManager.CurrentPermission.Range; if (rangeSquared > 0) { if ( (pManager.PlayerManager.ControlledEntity.GetComponent <ITransformComponent>() .Position - mouseWorld).LengthSquared() > rangeSquared) { return(false); } } var nodes = new List <Vector2f>(); if (pManager.CurrentPrototype.MountingPoints != null) { nodes.AddRange( pManager.CurrentPrototype.MountingPoints.Select( current => new Vector2f(mouseWorld.X, currentTile.Y + current))); } else { nodes.Add(new Vector2f(mouseWorld.X, currentTile.Y + 0.5f)); nodes.Add(new Vector2f(mouseWorld.X, currentTile.Y + 1.0f)); nodes.Add(new Vector2f(mouseWorld.X, currentTile.Y + 1.5f)); } Vector2f closestNode = (from Vector2f node in nodes orderby(node - mouseWorld).LengthSquared() ascending select node).First(); mouseWorld = closestNode + new Vector2f(pManager.CurrentPrototype.PlacementOffset.X, pManager.CurrentPrototype.PlacementOffset.Y); mouseScreen = CluwneLib.WorldToScreen(mouseWorld).Round(); var range = pManager.CurrentPermission.Range; if (range > 0) { if ( (pManager.PlayerManager.ControlledEntity.GetComponent <ITransformComponent>() .Position - mouseWorld).LengthSquared() > range * range) { return(false); } } return(true); }
public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } spriteToDraw = GetDirectionalSprite(pManager.CurrentBaseSpriteKey); var spriteBounds = spriteToDraw.GetLocalBounds(); mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); var spriteSize = CluwneLib.PixelToTile(new Vector2f(spriteBounds.Width, spriteBounds.Height)); // TODO: Doublecheck this. Use SizeF? var spriteRectWorld = new FloatRect(mouseWorld.X - (spriteSize.X / 2f), mouseWorld.Y - (spriteSize.Y / 2f), spriteSize.X, spriteSize.Y); if (pManager.CurrentPermission.IsTile) { return(false); } currentTile = currentMap.GetTileRef(mouseWorld); //Align to similar if nearby found else free if (currentTile.Tile.TileDef.IsWall) { return(false); //HANDLE CURSOR OUTSIDE MAP } var rangeSquared = pManager.CurrentPermission.Range * pManager.CurrentPermission.Range; if (rangeSquared > 0) { if ( (pManager.PlayerManager.ControlledEntity.GetComponent <TransformComponent>(ComponentFamily.Transform) .Position - mouseWorld).LengthSquared() > rangeSquared) { return(false); } } Entity[] nearbyEntities = ((EntityManager)IoCManager.Resolve <IEntityManagerContainer>().EntityManager).GetEntitiesInRange( mouseWorld, snapToRange); IOrderedEnumerable <Entity> snapToEntities = from Entity entity in nearbyEntities where entity.Template == pManager.CurrentTemplate orderby (entity.GetComponent <TransformComponent>( ComponentFamily.Transform).Position - mouseWorld).LengthSquared() ascending select entity; if (snapToEntities.Any()) { Entity closestEntity = snapToEntities.First(); ComponentReplyMessage reply = closestEntity.SendMessage(this, ComponentFamily.Renderable, ComponentMessageType.GetSprite); //if(replies.Any(x => x.messageType == SS13_Shared.GO.ComponentMessageType.CurrentSprite)) //{ // Sprite closestSprite = (Sprite)replies.Find(x => x.messageType == SS13_Shared.GO.ComponentMessageType.CurrentSprite).paramsList[0]; //This is safer but slower. if (reply.MessageType == ComponentMessageType.CurrentSprite) { var closestSprite = (Sprite)reply.ParamsList[0]; //This is faster but kinda unsafe. var closestBounds = closestSprite.GetLocalBounds(); var closestRect = new FloatRect( closestEntity.GetComponent <TransformComponent>(ComponentFamily.Transform).Position.X - closestBounds.Width / 2f, closestEntity.GetComponent <TransformComponent>(ComponentFamily.Transform).Position.Y - closestBounds.Height / 2f, closestBounds.Width, closestBounds.Height); var sides = new List <Vector2f> { new Vector2f(closestRect.Left + (closestRect.Width / 2f), closestRect.Top - closestBounds.Height / 2f), new Vector2f(closestRect.Left + (closestRect.Width / 2f), closestRect.Bottom() + closestBounds.Height / 2f), new Vector2f(closestRect.Left - closestBounds.Width / 2f, closestRect.Top + (closestRect.Height / 2f)), new Vector2f(closestRect.Right() + closestBounds.Width / 2f, closestRect.Top + (closestRect.Height / 2f)) }; Vector2f closestSide = (from Vector2f side in sides orderby(side - mouseWorld).LengthSquared() ascending select side).First(); mouseWorld = closestSide; mouseScreen = CluwneLib.WorldToScreen(mouseWorld).Round(); } } spriteRectWorld = new FloatRect(mouseWorld.X - (spriteBounds.Width / 2f), mouseWorld.Y - (spriteBounds.Height / 2f), spriteBounds.Width, spriteBounds.Height); if (pManager.CollisionManager.IsColliding(spriteRectWorld)) { return(false); } return(true); }
public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } spriteToDraw = GetDirectionalSprite(pManager.CurrentBaseSpriteKey); mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); var bounds = spriteToDraw.GetLocalBounds(); var spriteSize = CluwneLib.PixelToTile(new Vector2f(bounds.Width, bounds.Height)); var spriteRectWorld = new FloatRect(mouseWorld.X - (spriteSize.X / 2f), mouseWorld.Y - (spriteSize.Y / 2f), spriteSize.X, spriteSize.Y); if (pManager.CurrentPermission.IsTile) { return(false); } //CollisionManager collisionMgr = (CollisionManager)ServiceManager.Singleton.GetService(ClientServiceType.CollisionManager); //if (collisionMgr.IsColliding(spriteRectWorld, true)) validPosition = false; currentTile = currentMap.GetTileRef(mouseWorld); if (!currentTile.Tile.TileDef.IsWall) { return(false); } var rangeSquared = pManager.CurrentPermission.Range * pManager.CurrentPermission.Range; if (rangeSquared > 0) { if ( (pManager.PlayerManager.ControlledEntity.GetComponent <TransformComponent>(ComponentFamily.Transform) .Position - mouseWorld).LengthSquared() > rangeSquared) { return(false); } } var nodes = new List <Vector2f>(); if (pManager.CurrentTemplate.MountingPoints != null) { nodes.AddRange( pManager.CurrentTemplate.MountingPoints.Select( current => new Vector2f(mouseWorld.X, currentTile.Y + current))); } else { nodes.Add(new Vector2f(mouseWorld.X, currentTile.Y + 0.5f)); nodes.Add(new Vector2f(mouseWorld.X, currentTile.Y + 1.0f)); nodes.Add(new Vector2f(mouseWorld.X, currentTile.Y + 1.5f)); } Vector2f closestNode = (from Vector2f node in nodes orderby(node - mouseWorld).LengthSquared() ascending select node).First(); mouseWorld = closestNode + new Vector2f(pManager.CurrentTemplate.PlacementOffset.Key, pManager.CurrentTemplate.PlacementOffset.Value); mouseScreen = CluwneLib.WorldToScreen(mouseWorld).Round(); var range = pManager.CurrentPermission.Range; if (range > 0) { if ( (pManager.PlayerManager.ControlledEntity.GetComponent <TransformComponent>(ComponentFamily.Transform) .Position - mouseWorld).LengthSquared() > range * range) { return(false); } } return(true); }