اکنون کد باید شبیه زیر باشد.
| :كد |
datablock PlayerData(Player Body)
{
className = Armor;
...
|
دادن میزان Armor به متغیر className می تواند تمامی تمام بازیکن ها را به Armor ارث بدهد.
کد زیر را هم در پایین تمامی کدها بگذارید. تا تابع Player::playDeathAnimation تعریف گردد.
| :كد |
function Player::playDeathAnimation( %this )
{
%this.setActionThread( "die" );
}
|
این تابع در هنگامی که بازیکن می خواهد دور از جون شما ! بمیرد فراخوانی می گردد.
اکنون به جاهای سختش رسیدیم. درست در زیر این کد باید کدهای زیر را وارد نمایید اما نترسید برایتان توضیح می دهم که کارش چیست
| :كد |
function Armor::damage( %this, %obj, %sourceObject, %position,
%damage, %damageType )
{
// If we're already dead, don't bother with it...
if( %obj.getState() $= "Dead" )
return;
%obj.applyDamage( %damage );
echo( "Damage Type = " @ %damageType );
// Deal with client callbacks here because we don't have this information
// in the onDamage or onDisabled methods
%client = %obj.client;
%sourceClient = %sourceObject ? %sourceObject.client : 0;
if( %obj.getState() $= "Dead" )
%client.onDeath( %sourceObject, %sourceClient, %damageType, %location );
}
|
این تابع توضیح می دهد که اگر هر شی یا تابعی که احتیاج به اعمال آسیب بر روی این شی را دارد اینجا ما تعیین می کنیم که چقدر آسیب وارد کند.
نکته: این تابع نمی تواند خوب برای شخصیت ها کار کند مگر اینکه از ShapeBase استفاده کنیم. و باید فایلی با نام shapeBase.cs را هم به پوشه server اضافه کرده باشیم. که این فایل همراه با سایر فایلها در ضمیمه این پست آمده است.
خوب به بحث بازگردیم. در زیر کدهای تابع Armor::damage که الان اضافه کردید کدهای زیر را اضافه کنید.
| :كد |
function Armor::onDisabled( %this, %obj, %state )
{
// If we want to deal with the damage information that actually caused
// this death, then we would have to move this code into the script
// "damage" method.
%obj.playDeathAnimation();
// Release the main weapon trigger.
%obj.setImageTrigger( 0, false );
// Schedule time and duration of fade-out for dead players.
%obj.schedule( 6000, "startFade", 1000, 0, true );
// Schedule deletion for dead players.
%obj.schedule( 8000, "delete" );
}
|
این قسمت از کد برای هنگامی است که اشیای ما در حالت غیر فعال هستند. این حالت مربوط به زمانی است که اشیا یا شخصیتهای ما در حالت مرگ هستند و دیگر هیچ جنب و جوشی ندارند.
خوب این آخرین تغییر فایل Player.cs است. اکنون فایل را ذخیره و ببندید.
rocket_launcher.cs را از پوشه server باز نمایید. اکنون باید بلوک اطلاعاتی RocketProjectile را تغییر دهید.
| :كد |
datablock ProjectileData( RocketProjectile )
{
...
directDamage = 50;
radiusDamage = 25;
damageRadius = 1.5;
...
|
تابع RocketProjectile::onCollision را به شکل زیر تغییر دهید:
| :كد |
function RocketProjectile::onCollision( %this, %obj, %col, %fade, %pos, %normal )
{
echo("RocketProjectile::onCollision called! ----------------------------");
// For direct hits... apply damage to all shape base objects
if( %col.getType() & $TypeMasks::ShapeBaseObjectType )
%col.damage( %obj, %pos, %this.directDamage, "Rocket" );
// For radius damage hits... use the radiusDamage utility function defined
// by the radiusDamage.cs script to see if we our player or bot will take
// any damage.
radiusDamage( %obj, VectorAdd(%pos, VectorScale(%normal, 0.01)),
%this.damageRadius, %this.radiusDamage, "Radius", 40 );
}
|
این هم از rocket_launcher.cs اکنون آن را بسته و ذخیره نمایید.
اکنون Torque را اجرا کنید و به شخصیتی که در مسیریاب مشغول دویدن است تیراندازی کنید. در حالی که به شخصیت تیراندازی می کنید بر روی دکمه ~ از روی صفحه کلید کلیک کنید. می بینید که هنگام برخورد تیر به شخصیت این متون در بخش console نمایش داده می شود.
| :كد |
...
RocketProjectile::onCollision called! ----------------------------
Damage Type = Rocket
RocketProjectile::onCollision called! ----------------------------
radiusDamage called!
Damage Type = Radius
RocketProjectile::onCollision called! ----------------------------
radiusDamage called!
Damage Type = Radius
RocketProjectile::onCollision called! ----------------------------
radiusDamage called!
Damage Type = Radius
...
|