//---------------------------------------------------------------------------------------------------------------------------------------------------
//
// 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)
{
}
}
}