protected MyBehaviorTreeState Teleport() { if (Bot.Player.Character.HasAnimation("Deburrow")) { Bot.Player.Character.PlayCharacterAnimation("Deburrow", MyBlendOption.Immediate, MyFrameOption.JustFirstFrame, 0.0f, 1, sync: true); Bot.AgentEntity.DisableAnimationCommands(); } MatrixD teleportPos; bool success = MySpaceBotFactory.GetSpiderSpawnPosition(out teleportPos, Bot.Player.GetPosition()); if (!success) { return(MyBehaviorTreeState.FAILURE); } Vector3D pos = teleportPos.Translation; float radius = (float)Bot.AgentEntity.PositionComp.WorldVolume.Radius; var planet = MyGravityProviderSystem.GetNearestPlanet(pos); if (planet != null) { planet.CorrectSpawnLocation(ref pos, radius); teleportPos.Translation = pos; } else { Vector3D?freePlace = MyEntities.FindFreePlace(teleportPos.Translation, radius, stepSize: 0.2f); if (freePlace.HasValue) { teleportPos.Translation = freePlace.Value; } } Bot.AgentEntity.SetPhysicsEnabled(false); Bot.AgentEntity.WorldMatrix = teleportPos; Bot.AgentEntity.Physics.CharacterProxy.Up = teleportPos.Up; Bot.AgentEntity.Physics.CharacterProxy.Forward = teleportPos.Forward; Bot.AgentEntity.SetPhysicsEnabled(true); return(MyBehaviorTreeState.SUCCESS); }
protected MyBehaviorTreeState Teleport() { if (Bot.Player.Character.HasAnimation("Deburrow")) { Bot.Player.Character.PlayCharacterAnimation("Deburrow", MyBlendOption.Immediate, MyFrameOption.JustFirstFrame, 0.0f, 1, sync: true); Bot.AgentEntity.DisableAnimationCommands(); } MatrixD teleportPos; bool success = MySpaceBotFactory.GetSpiderSpawnPosition(out teleportPos, Bot.Player.GetPosition()); if (!success) { return(MyBehaviorTreeState.FAILURE); } Vector3D pos = teleportPos.Translation; //GR: Added simple check so burrowing (and Teleport) functions should happen only when on Voxel physics. //Not sure though if this check should be somewhere else (e.g. behaviour Tree) //Check position of Teleport if is clear var resultOnTeleportPos = Sandbox.Engine.Physics.MyPhysics.CastRay(pos + 3 * Bot.AgentEntity.WorldMatrix.Up, pos - 3 * Bot.AgentEntity.WorldMatrix.Up, Sandbox.Engine.Physics.MyPhysics.CollisionLayers.NoVoxelCollisionLayer); if (resultOnTeleportPos != null) { return(MyBehaviorTreeState.NOT_TICKED); } //GR: Also check current position of spider if on CubeGrid do not teleport var resultOnSpiderPos = Sandbox.Engine.Physics.MyPhysics.CastRay(Bot.AgentEntity.WorldMatrix.Translation - 3 * Bot.AgentEntity.WorldMatrix.Up, Bot.AgentEntity.WorldMatrix.Translation + 3 * Bot.AgentEntity.WorldMatrix.Up, Sandbox.Engine.Physics.MyPhysics.CollisionLayers.NoVoxelCollisionLayer); if (resultOnSpiderPos != null && (resultOnSpiderPos as VRage.Game.ModAPI.IHitInfo).HitEntity != Bot.AgentEntity) { resultOnSpiderPos = Sandbox.Engine.Physics.MyPhysics.CastRay(Bot.AgentEntity.WorldMatrix.Translation - 3 * Bot.AgentEntity.WorldMatrix.Up, Bot.AgentEntity.WorldMatrix.Translation + 3 * Bot.AgentEntity.WorldMatrix.Up, Sandbox.Engine.Physics.MyPhysics.CollisionLayers.NoVoxelCollisionLayer); return(MyBehaviorTreeState.NOT_TICKED); } float radius = (float)Bot.AgentEntity.PositionComp.WorldVolume.Radius; var planet = MyGamePruningStructure.GetClosestPlanet(pos); if (planet != null) { planet.CorrectSpawnLocation(ref pos, radius); teleportPos.Translation = pos; } else { Vector3D?freePlace = MyEntities.FindFreePlace(teleportPos.Translation, radius, stepSize: 0.2f); if (freePlace.HasValue) { teleportPos.Translation = freePlace.Value; } } Bot.AgentEntity.SetPhysicsEnabled(false); Bot.AgentEntity.WorldMatrix = teleportPos; Bot.AgentEntity.Physics.CharacterProxy.Up = teleportPos.Up; Bot.AgentEntity.Physics.CharacterProxy.Forward = teleportPos.Forward; Bot.AgentEntity.SetPhysicsEnabled(true); return(MyBehaviorTreeState.SUCCESS); }