mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-27 08:04:45 +00:00
152 lines
5.2 KiB
C#
152 lines
5.2 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.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// These scripts make use of dynamic attribute values on Item datablocks,
|
|
// these are as follows:
|
|
//
|
|
// maxInventory Max inventory per object (100 bullets per box, etc.)
|
|
// pickupName Name to display when client pickups item
|
|
//
|
|
// Item objects can have:
|
|
//
|
|
// count The # of inventory items in the object. This
|
|
// defaults to maxInventory if not set.
|
|
|
|
// Respawntime is the amount of time it takes for a static "auto-respawn"
|
|
// object, such as an ammo box or weapon, to re-appear after it's been
|
|
// picked up. Any item marked as "static" is automaticlly respawned.
|
|
$Item::RespawnTime = 30 * 1000;
|
|
|
|
// Poptime represents how long dynamic items (those that are thrown or
|
|
// dropped) will last in the world before being deleted.
|
|
$Item::PopTime = 30 * 1000;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// ItemData base class methods used by all items
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function Item::respawn(%this)
|
|
{
|
|
// This method is used to respawn static ammo and weapon items
|
|
// and is usually called when the item is picked up.
|
|
// Instant fade...
|
|
%this.startFade(0, 0, true);
|
|
%this.setHidden(true);
|
|
|
|
// Shedule a reapearance
|
|
%this.schedule($Item::RespawnTime, "setHidden", false);
|
|
%this.schedule($Item::RespawnTime + 100, "startFade", 1000, 0, false);
|
|
}
|
|
|
|
function Item::schedulePop(%this)
|
|
{
|
|
// This method deletes the object after a default duration. Dynamic
|
|
// items such as thrown or drop weapons are usually popped to avoid
|
|
// world clutter.
|
|
%this.schedule($Item::PopTime - 1000, "startFade", 1000, 0, true);
|
|
%this.schedule($Item::PopTime, "delete");
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Callbacks to hook items into the inventory system
|
|
|
|
function ItemData::onThrow(%this, %user, %amount)
|
|
{
|
|
// Remove the object from the inventory
|
|
if (%amount $= "")
|
|
%amount = 1;
|
|
if (%this.maxInventory !$= "")
|
|
if (%amount > %this.maxInventory)
|
|
%amount = %this.maxInventory;
|
|
if (!%amount)
|
|
return 0;
|
|
%user.decInventory(%this,%amount);
|
|
|
|
// Construct the actual object in the world, and add it to
|
|
// the mission group so it's cleaned up when the mission is
|
|
// done. The object is given a random z rotation.
|
|
%obj = new Item()
|
|
{
|
|
datablock = %this;
|
|
rotation = "0 0 1 "@ (getRandom() * 360);
|
|
count = %amount;
|
|
};
|
|
MissionGroup.add(%obj);
|
|
%obj.schedulePop();
|
|
return %obj;
|
|
}
|
|
|
|
function ItemData::onPickup(%this, %obj, %user, %amount)
|
|
{
|
|
// Add it to the inventory, this currently ignores the request
|
|
// amount, you get what you get. If the object doesn't have
|
|
// a count or the datablock doesn't have maxIventory set, the
|
|
// object cannot be picked up.
|
|
|
|
// See if the object has a count
|
|
%count = %obj.count;
|
|
if (%count $= "")
|
|
{
|
|
// No, so check the datablock
|
|
%count = %this.count;
|
|
if (%count $= "")
|
|
{
|
|
// No, so attempt to provide the maximum amount
|
|
if (%this.maxInventory !$= "")
|
|
{
|
|
if (!(%count = %this.maxInventory))
|
|
return;
|
|
}
|
|
else
|
|
%count = 1;
|
|
}
|
|
}
|
|
|
|
%user.incInventory(%this, %count);
|
|
|
|
// Inform the client what they got.
|
|
if (%user.client)
|
|
messageClient(%user.client, 'MsgItemPickup', '\c0You picked up %1', %this.pickupName);
|
|
|
|
// If the item is a static respawn item, then go ahead and
|
|
// respawn it, otherwise remove it from the world.
|
|
// Anything not taken up by inventory is lost.
|
|
if (%obj.isStatic())
|
|
%obj.respawn();
|
|
else
|
|
%obj.delete();
|
|
return true;
|
|
}
|
|
|
|
function ItemData::createItem(%data)
|
|
{
|
|
%obj = new Item()
|
|
{
|
|
dataBlock = %data;
|
|
static = true;
|
|
rotate = true;
|
|
};
|
|
return %obj;
|
|
}
|