mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-23 22:24:45 +00:00
109 lines
4.3 KiB
C#
109 lines
4.3 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Copyright (c) 2012 GarageGames, LLC
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
// IN THE SOFTWARE.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// This file contains ShapeBase methods used by all the derived classes
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// ShapeBase object
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// A raycast helper function to keep from having to duplicate code everytime
|
|
// that a raycast is needed.
|
|
// %this = the object doing the cast, usually a player
|
|
// %range = range to search
|
|
// %mask = what to look for
|
|
|
|
function ShapeBase::doRaycast(%this, %range, %mask)
|
|
{
|
|
// get the eye vector and eye transform of the player
|
|
%eyeVec = %this.getEyeVector();
|
|
%eyeTrans = %this.getEyeTransform();
|
|
|
|
// extract the position of the player's camera from the eye transform (first 3 words)
|
|
%eyePos = getWord(%eyeTrans, 0) SPC getWord(%eyeTrans, 1) SPC getWord(%eyeTrans, 2);
|
|
|
|
// normalize the eye vector
|
|
%nEyeVec = VectorNormalize(%eyeVec);
|
|
|
|
// scale (lengthen) the normalized eye vector according to the search range
|
|
%scEyeVec = VectorScale(%nEyeVec, %range);
|
|
|
|
// add the scaled & normalized eye vector to the position of the camera
|
|
%eyeEnd = VectorAdd(%eyePos, %scEyeVec);
|
|
|
|
// see if anything gets hit
|
|
%searchResult = containerRayCast(%eyePos, %eyeEnd, %mask, %this);
|
|
|
|
return %searchResult;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function ShapeBase::damage(%this, %sourceObject, %position, %damage, %damageType)
|
|
{
|
|
// All damage applied by one object to another should go through this method.
|
|
// This function is provided to allow objects some chance of overriding or
|
|
// processing damage values and types. As opposed to having weapons call
|
|
// ShapeBase::applyDamage directly. Damage is redirected to the datablock,
|
|
// this is standard procedure for many built in callbacks.
|
|
|
|
if (isObject(%this))
|
|
%this.getDataBlock().damage(%this, %sourceObject, %position, %damage, %damageType);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function ShapeBase::setDamageDt(%this, %damageAmount, %damageType)
|
|
{
|
|
// This function is used to apply damage over time. The damage is applied
|
|
// at a fixed rate (50 ms). Damage could be applied over time using the
|
|
// built in ShapBase C++ repair functions (using a neg. repair), but this
|
|
// has the advantage of going through the normal script channels.
|
|
|
|
if (%this.getState() !$= "Dead")
|
|
{
|
|
%this.damage(0, "0 0 0", %damageAmount, %damageType);
|
|
%this.damageSchedule = %this.schedule(50, "setDamageDt", %damageAmount, %damageType);
|
|
}
|
|
else
|
|
%this.damageSchedule = "";
|
|
}
|
|
|
|
function ShapeBase::clearDamageDt(%this)
|
|
{
|
|
if (%this.damageSchedule !$= "")
|
|
{
|
|
cancel(%this.damageSchedule);
|
|
%this.damageSchedule = "";
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// ShapeBase datablock
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function ShapeBaseData::damage(%this, %obj, %position, %source, %amount, %damageType)
|
|
{
|
|
// Ignore damage by default. This empty method is here to
|
|
// avoid console warnings.
|
|
}
|