public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); currentTile = currentMap.GetDefaultGrid().GetTile(mouseWorld); if (!RangeCheck()) { return(false); } if (pManager.CurrentPermission.IsTile) { mouseWorld = new Vector2(currentTile.X + 0.5f, currentTile.Y + 0.5f); mouseScreen = (Vector2i)CluwneLib.WorldToScreen(mouseWorld); } else { mouseWorld = new Vector2(currentTile.X + 0.5f + pManager.CurrentPrototype.PlacementOffset.X, currentTile.Y + 0.5f + pManager.CurrentPrototype.PlacementOffset.Y); mouseScreen = (Vector2i)CluwneLib.WorldToScreen(mouseWorld); // if (CheckCollision()) // return false; } return(true); }
public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); if (!(ongrid = currentMap.TryFindGridAt(mouseWorld, out IMapGrid currentgrid))) //Cant find a grid { return(false); } var mouselocal = currentgrid.WorldToLocal(mouseWorld); //Convert code to local grid coordinates snapsize = currentgrid.SnapSize; //Find snap size. mouselocal = new Vector2( //Round local coordinates onto the snap grid (float)(Math.Round((mouselocal.X / (double)snapsize - 0.5), MidpointRounding.AwayFromZero) + 0.5) * snapsize, (float)(Math.Round((mouselocal.Y / (double)snapsize - 0.5), MidpointRounding.AwayFromZero) + 0.5) * snapsize); //Convert back to original world and screen coordinates after applying offset mouseWorld = currentgrid.LocalToWorld(mouselocal) + new Vector2(pManager.CurrentPrototype.PlacementOffset.X, pManager.CurrentPrototype.PlacementOffset.Y); mouseScreen = (Vector2i)CluwneLib.WorldToScreen(mouseWorld); if (!RangeCheck()) { return(false); } return(true); }
public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); currentTile = currentMap.GetDefaultGrid().GetTile(mouseWorld); if (!RangeCheck()) { return(false); } var entitymanager = IoCManager.Resolve <IClientEntityManager>(); var failtoplace = entitymanager.AnyEntitiesIntersecting(new Box2(new Vector2(currentTile.X, currentTile.Y), new Vector2(currentTile.X + 0.99f, currentTile.Y + 0.99f))); if (pManager.CurrentPermission.IsTile) { mouseWorld = new Vector2(currentTile.X + 0.5f, currentTile.Y + 0.5f); mouseScreen = (Vector2i)CluwneLib.WorldToScreen(mouseWorld); } else { mouseWorld = new Vector2(currentTile.X + 0.5f + pManager.CurrentPrototype.PlacementOffset.X, currentTile.Y + 0.5f + pManager.CurrentPrototype.PlacementOffset.Y); mouseScreen = (Vector2i)CluwneLib.WorldToScreen(mouseWorld); } return(failtoplace); }
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 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(); 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); } } 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.CurrentPrototype.PlacementOffset.X, currentTile.Y + 0.5f + pManager.CurrentPrototype.PlacementOffset.Y); mouseScreen = CluwneLib.WorldToScreen(mouseWorld).Round(); FloatRect 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 override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); currentTile = currentMap.GetDefaultGrid().GetTile(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); currentTile = currentMap.GetTileRef(mouseWorld); return(true); }
public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); if (pManager.CurrentPermission.IsTile) { return(false); } currentTile = currentMap.GetDefaultGrid().GetTile(mouseWorld); if (!RangeCheck()) { return(false); } var nodes = new List <Vector2>(); if (pManager.CurrentPrototype.MountingPoints != null) { nodes.AddRange( pManager.CurrentPrototype.MountingPoints.Select( current => new Vector2(mouseWorld.X, currentTile.Y + current))); } else { nodes.Add(new Vector2(mouseWorld.X, currentTile.Y + 0.5f)); nodes.Add(new Vector2(mouseWorld.X, currentTile.Y + 1.0f)); nodes.Add(new Vector2(mouseWorld.X, currentTile.Y + 1.5f)); } Vector2 closestNode = (from Vector2 node in nodes orderby(node - mouseWorld).LengthSquared ascending select node).First(); mouseWorld = closestNode + new Vector2(pManager.CurrentPrototype.PlacementOffset.X, pManager.CurrentPrototype.PlacementOffset.Y); mouseScreen = (Vector2i)CluwneLib.WorldToScreen(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)); 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 void Render() { base.Render(); if (ongrid) { var position = CluwneLib.ScreenToWorld(new Vector2i(0, 0)); //Find world coordinates closest to screen origin var gridstart = CluwneLib.WorldToScreen(new Vector2( //Find snap grid closest to screen origin and convert back to screen coords (float)Math.Round((position.X / snapsize), MidpointRounding.AwayFromZero) * snapsize, (float)Math.Round((position.Y / snapsize), MidpointRounding.AwayFromZero) * snapsize)); for (float a = gridstart.X; a < CluwneLib.Window.Viewport.Size.X; a += snapsize * 32) //Iterate through screen creating gridlines { CluwneLib.drawLine(a, 0, CluwneLib.Window.Viewport.Size.Y, 90, 0.5f, Color4.Blue); } for (float a = gridstart.Y; a < CluwneLib.Window.Viewport.Size.Y; a += snapsize * 32) { CluwneLib.drawLine(0, a, CluwneLib.Window.Viewport.Size.X, 0, 0.5f, Color4.Blue); } } }
public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); currentTile = currentMap.GetDefaultGrid().GetTile(mouseWorld); if (pManager.CurrentPermission.IsTile) { return(false); } if (!RangeCheck()) { return(false); } return(true); }
public override bool Update(Vector2i mouseS, IMapManager currentMap) { if (currentMap == null) { return(false); } mouseScreen = mouseS; mouseWorld = CluwneLib.ScreenToWorld(mouseScreen); if (pManager.CurrentPermission.IsTile) { return(false); } currentTile = currentMap.GetDefaultGrid().GetTile(mouseWorld); if (!RangeCheck()) { return(false); } var manager = IoCManager.Resolve <IClientEntityManager>(); IOrderedEnumerable <IEntity> snapToEntities = from IEntity entity in manager.GetEntitiesInRange(mouseWorld, snapToRange) where entity.Prototype == pManager.CurrentPrototype orderby (entity.GetComponent <ITransformComponent>( ).Position - mouseWorld).LengthSquared ascending select entity; if (snapToEntities.Any()) { IEntity closestEntity = snapToEntities.First(); if (closestEntity.TryGetComponent <ISpriteRenderableComponent>(out var component)) { var closestSprite = component.GetCurrentSprite(); var closestBounds = closestSprite.GetLocalBounds(); var closestRect = Box2.FromDimensions( closestEntity.GetComponent <ITransformComponent>().Position.X - closestBounds.Width / 2f, closestEntity.GetComponent <ITransformComponent>().Position.Y - closestBounds.Height / 2f, closestBounds.Width, closestBounds.Height); var sides = new Vector2[] { new Vector2(closestRect.Left + (closestRect.Width / 2f), closestRect.Top - closestBounds.Height / 2f), new Vector2(closestRect.Left + (closestRect.Width / 2f), closestRect.Bottom + closestBounds.Height / 2f), new Vector2(closestRect.Left - closestBounds.Width / 2f, closestRect.Top + (closestRect.Height / 2f)), new Vector2(closestRect.Right + closestBounds.Width / 2f, closestRect.Top + (closestRect.Height / 2f)) }; Vector2 closestSide = (from Vector2 side in sides orderby(side - mouseWorld).LengthSquared ascending select side).First(); mouseWorld = closestSide; mouseScreen = (Vector2i)CluwneLib.WorldToScreen(mouseWorld); } } if (CheckCollision()) { 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)); 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); 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); } } var manager = IoCManager.Resolve <IClientEntityManager>(); IOrderedEnumerable <IEntity> snapToEntities = from IEntity entity in manager.GetEntitiesInRange(mouseWorld, snapToRange) where entity.Prototype == pManager.CurrentPrototype orderby (entity.GetComponent <TransformComponent>( ComponentFamily.Transform).Position - mouseWorld).LengthSquared() ascending select entity; if (snapToEntities.Any()) { IEntity 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(); } } FloatRect 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); }