//--------------------------------------------------------------------------------------------------------------------------------------------------- // // Copyright (C)2007 DarkWynter Studios. All rights reserved. // //--------------------------------------------------------------------------------------------------------------------------------------------------- // {Contact : darkwynter.com for licensing information //--------------------------------------------------------------------------------------------------------------------------------------------------- namespace DarkWynter.Game.GameObjects { #region Using Statements using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Storage; using System.Xml; #endregion using DarkWynter.Engine.Globals; using DarkWynter.Engine.Physics; using DarkWynter.Engine.ObjectLib; using DarkWynter.Engine.GameObjects; using DarkWynter.Engine.Init; using DarkWynter.Stream; using System.Diagnostics; using DarkWynter.Engine.Utilities; using DarkWynter.Engine.EventControl; /// /// An abstract door with locking mechanics. /// public class WaterPlane : GameObject { Vector2 blendTexturePos1 = new Vector2(0); Vector2 blendTexturePos2 = new Vector2(0); Stopwatch stopWatch = new Stopwatch(); const int TIMER = 100000; /// /// Portal constructor /// public WaterPlane(Load gameObjectLoader) : base(gameObjectLoader) { mass.objectType = Enums_Engine.ObjectType.PORTAL; mass.dynamicFrictionCoefficient = 0.0f; mass.isMoving = true; } /// /// Override and supplament base loading in GameObject. /// /// XML node containing load data. /// ObjectLibrary that portal belongs to. /// True if it was able to load, else false public override bool Load(ObjectLibrary objectLibrary) { // Call before user code is executed if (!base.Load(objectLibrary)) { return false; } // Get terrain height at position // float yPosition = objectLibrary.terrain.GetTerrainHeight(load.startPosition.X / Statics_Engine.TerrainSettings.terrainScaleFactor, // load.startPosition.Z / Statics_Engine.TerrainSettings.terrainScaleFactor); float yPosition = float.Parse(load.node.Attributes["y"].Value) * Statics_Engine.TerrainSettings.terrainScaleFactor; // Set position and reference Vector3 locpos = new Vector3(load.startPosition.X, yPosition, load.startPosition.Z); Vector3 refpos = new Vector3(load.startPosition.X, yPosition, load.startPosition.Z - 1); mass.SetPosition(locpos, refpos); draw.drawMethod = Enums_Stream.DrawMethod.BasicGameObject_Draw; //draw.technique = "ToonShaderMain"; draw.technique = "FlickerFlame"; //mass.boundingVolume = new BoundingVolume(new BoundingBox(mass.currentPosition - mass.scale, mass.currentPosition + mass.scale)); //mass.boundingVolume = new BoundingVolume(new BoundingSphere(mass.currentPosition, 100.0f)); //mass.scale.Y = 100.0f; Vector3 boundingScale= new Vector3(mass.scale.X, 100.0f, mass.scale.Z); // Min n Max values for the bounding box Vector3 min = mass.currentPosition - boundingScale / 2.0f; Vector3 max = min + boundingScale; // Since we want all objects below the plane to collide, set min.Y to a large negative min.Y = -1000.0f; mass.boundingVolume = new BoundingVolume(new BoundingBox(min, max)); // CLEAN:---X2 hack for alignment //float massScale = mass.scale.X * 2; //mass.boundingVolume = // new BoundingVolume( // new Vector2(mass.currentPosition.X, mass.currentPosition.Z), // new Vector2(mass.currentPosition.X + massScale, mass.currentPosition.Z + massScale)); draw.textureList.Add(Statics_Engine.SystemSettings.content.Load("Content/_textures/FireRed")); //draw.textureList.Add(Statics_Engine.SystemSettings.content.Load("Content/_textures/FireDesert")); draw.textureList.Add(Statics_Engine.SystemSettings.content.Load("Content/_textures/FireBlue")); draw.textureList.Add(Statics_Engine.SystemSettings.content.Load("Content/_textures/FireAir")); stopWatch.Start(); blendTexturePos1 = Vector2.Zero; blendTexturePos2 = Vector2.One; ShaderParameters.DrawFX.blendTexturePosition1.SetValue(blendTexturePos1); ShaderParameters.DrawFX.blendTexturePosition2.SetValue(blendTexturePos2); return true; } /// /// Override and supplement base Update in GameObject. /// /// ObjectLibrary that portal belongs to. public override void Update(ref ObjectLibrary objectLibrary) { // Call before user code is executed // base.Update(ref objectLibrary); float yThickness = 100; Matrix xrotation = Matrix.CreateRotationX((float)(-Math.PI / 2)); Matrix yRotation = Matrix.CreateRotationY((float)(3.0 * Math.PI / 2)); this.mass.currentRotation = Quaternion.CreateFromRotationMatrix(xrotation * yRotation); mass.boundingVolume.UpdateBox( new Vector3(5000.0f, mass.currentPosition.Y, 5000.0f), mass.currentRotation, new Vector3(mass.scale.X, yThickness, mass.scale.Z)); } /// /// Override and supplement response to colliding GameObjects /// /// Object that hit the Portal. /// Force that Portal was hit with. /// ObjectLibrary that portal belongs to. /// True if collidedObject needs to be recycled public override bool ObjectCollisionResponse(GameObject collidedObject, Vector3 resultantForce, ObjectLibrary objectLibrary) { if (collidedObject.mass.objectType != Enums_Engine.ObjectType.PLAYER) { } if (collidedObject is Human) { Player player = collidedObject as Player; player.SetSpawnPoint(Statics_Engine.PlayerSettings.lastSpawnPoint); //player.ResetSpawnPoint(spawn); Logging.G2LLogList.Add(DateTime.Now.ToString() + " - [Game Message] Player either drowned or was eaten by sharks [End Game Message]"); } return false; } /// /// Overrides and supplements response to this object hitting the ground. /// /// The terrain object which this Portal hit. public override void TerrainCollisionResponse(Terrain terrain) { base.GetObjectHeight(terrain); // Add Gravity if terrain and player are touching if (heightDifference < 0.0f) { mass.AddForce(mass.mass * Statics_Engine.GameSettings.accelDueToGravity); } else if (heightDifference > 0.0f) { base.TerrainCollisionResponse(terrain); if (mass.totalForce.Y > 0.0f) { mass.totalForce.Y = 0.0f; } if (mass.velocity.Y > 0.0f) { mass.velocity.Y = 0.0f; } if (heightDifference < 0.0f) { mass.AddForce(mass.mass * Statics_Engine.GameSettings.accelDueToGravity); } else if (heightDifference > 0.0f) { if (mass.totalForce.Y > 0.0f) { mass.totalForce.Y = 0.0f; } if (mass.velocity.Y > 0.0f) { mass.velocity.Y = 0.0f; } // Ground pushing up to negate gravity mass.AddForce(new Vector3(0.0f, heightDifference * terrain.propSurfaceTension, 0.0f) - (new Vector3(0.0f, mass.totalForce.Y, 0.0f) + new Vector3(0.0f, mass.velocity.Y * mass.mass / Statics_Engine.SystemSettings.dt, 0.0f))); } } } /// /// Override draw for portal /// public override Draw Draw() { // When position reaches one, reset to zero //if (blendTexturePos1.X > 1.0f || blendTexturePos1.Y > 1.0f) //{ // blendTexturePos1 = Vector2.Zero; // blendTexturePos2 = Vector2.Zero; //} //// Update position based on timer //if (stopWatch.ElapsedMilliseconds > TIMER) //{ // blendTexturePos1.X += .0000001f; // blendTexturePos1.Y += .0000001f; // blendTexturePos2.X += .0000001f; // blendTexturePos2.Y += .0000001f; // stopWatch.Reset(); // stopWatch.Start(); //} // Blend the textures ShaderParameters.DrawFX.blendTexturePosition1.SetValue(blendTexturePos1); ShaderParameters.DrawFX.blendTexturePosition2.SetValue(blendTexturePos2); // Calculate ObjectSpace(Rotation) and WorldSpace(Translation) Transformation Matrix draw.matrix = draw.initialTransform * Matrix.CreateScale(mass.scale) * Matrix.CreateFromQuaternion(mass.currentRotation) * Matrix.CreateTranslation(mass.currentPosition); return draw; } /// /// Override and supplement base Billboard drawing specific to this Portal. /// /// ObjectLibrary that portal belongs to. /// Dynamic list of billboards to be drawn this frame. public override void Draw_Billboards(ObjectLibrary objectLibrary, BillboardList gameObjectBillboards) { } } }