Перейти к публикации
Планета Deus Ex

Вопросы Андриевской Вероники


Рекомендованные сообщения

Сегодня я весь день протрахалась (иначе не скажешь) с классом WeaponAssaultGun пытаясь привернуть к оружию нормальный звук выстрела.

Простая замена ничего не давала (происходил какой-то кошмар в виде зацикливания звука) и увеличение скорости анимации выстрела и звука соответственно таким методом:

 

simulated function PlaySelectiveFiring()

{

if (bAutomatic)

{



LoopAnim('Shoot',1,0.01);

}

// параметры : 'анимация', быстрота, время.

else

{



PlayAnim('Shoot',1,0.01);

}

}

приводило в затормаживанию, особенно на тяжелых картах

 

Я решила эту проблему установив на AmbientSound новый звук выстрела (я посмотрела как это сделать в HardCoreDX. Там именно так и было сделано)

 

Вот собственно весь скрипт целиком, с моими изменениями и добавлениями:

 

//=============================================================================

// AV_AssaultGun: МОЩНАЯ Штурмовая винтовка!

// Части кода Copyright (C) Hejhujka.

//=============================================================================

class AV_AssaultGun extends WeaponAssaultGUN;



simulated function PlaySelectiveFiring()

{

if (bAutomatic)

{

 bAutomatic = True;

bRapidFire = False;

LoopAnim('Shoot',1,0.1);

}

// параметры : 'анимация', быстрота, время.

else

{

bAutomatic = False;

bRapidFire = True;

PlayAnim('Shoot',1,0.1);

}

}







simulated function PlayFiringSound()

{

// Пусто.

}



state NormalFire

{

      	 function Tick( float DeltaTime )

{

              	 Global.Tick( DeltaTime );

 if ((Owner==None) || Owner.IsInState('Dying') || 

                       ((Level.NetMode != NM_StandAlone) && ((Pawn(Owner) != None) && (Pawn(Owner).bFire == 0)))) 

	 AmbientSound = None;

}



      	 function BeginState()

{

// Если есть глушитель то звук выстрела--другой.

 if ( bHasSilencer )

	 AmbientSound = Sound'Veronika_mod_01_core.SilentFire';

 else

              	 AmbientSound = FireSound;

              	 Super.BeginState();

}	



function EndState()

{

              	 AmbientSound = None;

              	 PlayEndFire();

              	 Super.EndState();

}

} 



simulated function EndState()

{

              	 AmbientSound = None;

                PlayEndFire();

              	 Super.EndState();

}





simulated function PlayEndFire()

{

//	PlaySimSound( Misc5Sound, SLOT_None, TransientSoundVolume, 2048 );

}

//============================================================================



//=============================================================================

// Если заряжены "горячие" патроны, то цель вспыхивает!

function name WeaponDamageType()

{ 

   if (AmmoType.IsA('Ammo762mm_HOT'))

{

HitDamage=10;

 return 'Flamed';

}

//----------

   if (AmmoType.IsA('Ammo762mm_SPEC'))

      {

HitDamage=150;

       return 'Shot';

      }

//----------

   if (AmmoType.IsA('AV_Ammo762mm'))

{

HitDamage=18;

       return 'Shot';

}

} 





//=============================================================================



defaultproperties

{

    ShotTime=0.10

    reloadTime=2.000000

    HitDamage=15

    maxRange=20000

    AccurateRange=5500

         projectileNames(1)=none // Хм. 

    msgOutOf="У вас нет %s чтобы их зарядить!"

     ReloadCount=50

    PickupAmmoCount=50

   

    bAutomatic=True

    shakemag=1.000000

    FireSound=Sound'Veronika_mod_01_Core.Auto_fire'

  

    InventoryGroup=89

    bCanHaveSilencer=FALSE

    PickupMessage="Вы нашли"

    ItemName="Штурмовая винтовка Ш-01"

    ItemArticle="оружие"

    Description="Штурмовая винтовка калибра 7.62x51мм. Обладает высoкой скорострельностью и обоймой на 50 патронов. Для нее были разработаны специальные патроны, которыми можно поразить различные виды целей."

    beltDescription="ШТУРМ Ш01"

    Mass=20.000000

    SoundVolume=255

}

Ссылка на комментарий
  • Ответы 186
  • Создано
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

А в нём не решена такая проблема? Кол-во проигрываний звука привязано к анимации выстрела. Т.е. чтобы сделать полноценную систему "один патрон-выстрел - один звук", нужно делать анимацию очень короткой (так сделано в Cassandra project), что выглядит очень некрасиво, да и уже существующие модели не переделать.

Ссылка на комментарий

Не знаю... Мне нужно было чтобы был длинный звук и я это решила.

 

Возьми да попробуй. Мне мой готовый пак пока выложить нет возможности.

Ссылка на комментарий

ЯЧС спросил у меня как делаються лестницы (вертикальные). Я решила написать здесь, так как другим возможно тоже будет интересно.

Нужно просто сделать лестницу из текстуры в группе Ladder в текстурпаке CoreTexMatal.utx.

Нужна текстура именно из группы Ladder

 

Можно создать свой текстурпак со своей текстурой лестницы, при импорте надо указать что она будет в группе Ladder.

 

Обо все этом написано в документации по редактору :wink:

 

Вот карта-пример: http://veronika-and.nm.ru/Ladder_test.zip

Ссылка на комментарий
  • 2 недели спустя...

Сегодня нашла у себя в папке со скаченными файлами довольно интересный скрипт. Если взять любое оружие и объявить его подклассом DoubleWeapBase (я хочу сказать Class НЕЧТО expands DoubleWeapBase) то можно будет стрелять сразу с двух оружий. Второе оружия в руке появляеться если подобрать такой-же класс оружия.

Скрипт правда глюковатый но рабочий.

 

Если позабавиться--то вполне сойдет :lol: :lol: :lol: :D

Или как Easter egg :lol:

А так я не думаю что скажем два дробовика в DeusEx это нормально.

 

Скриншот с моим варианотм применения:

http://veronika-and.nm.ru/doubleweapon.jpg

 

Сам скрипт:

 

 

//=============================================================================
// DoubleWeapBase.
// Created on 11th June 2001 @ 11:23:01
//
// <Version> 0.4a
// <RenZo>
// <MAILTO>
// <Double>
// <and>
// <also>
// if u use this class or any part of it in any of yourmods or maps
// please give me and the Dx Community credit for the parts you use
// also let us know what the mod is so we can download it and play it
// <Created>
//=============================================================================
class DoubleWeapBase expands DeusExWeapon;

/*Var(DualWeapons) bool bReplaceCrossHair;*/
Var Bool bDual,bSlave;
var byte WeapUsed;
var DoubleWeapBase SlaveWeap;
var(DeusExWeapon) String SecondPickupMsg;

replication
{
reliable if(ROLE==Role_Authority)
bDual,bSlave,SlaveWeap,WeapUsed/*,setCrossHairVis*/;
}

simulated Function PreBeginPlay()
{
Super.prebeginplay();
// please in the Child classes include the multiplayer 
// info here
}



/*Simulated Function SetCrossHairVis(bool HideShow)
{
   DeusExRootWindow(DeusExPlayer(owner).rootWindow).hud.Cross.setCrosshair(HideShow);
}*/



function SetHand(float Hand)

{

if(!bSlave && !bDual)

 super.SetHand(Hand);

else if(bDual)

 Super.SetHand(-1);

else if(bSlave)

 Super.SetHand(1);

}



// OverRide Function for fire offsets

simulated function Vector ComputeProjectileStart(Vector X, Vector Y, Vector Z)

{

local Vector Start;



// if we are instant-hit, non-projectile, then don't offset our starting point by PlayerViewOffset

if (bInstantHit)

 Start = Owner.Location + Pawn(Owner).BaseEyeHeight * vect(0,0,1);// — Vector(Pawn(Owner).ViewRotation)*(0.9*Pawn(Owner).CollisionRadius);

else{

 if(WeapUsed == 0 || SlaveWeap == none) {

 Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z;

 } Else {

 Start = Owner.Location + SlaveWeap.CalcDrawOffset() + SlaveWeap.FireOffset.X * X + SlaveWeap.FireOffset.Y * Y + SlaveWeap.FireOffset.Z * Z;

    }

}

return Start;

}



function Tick(float DeltaTime)

{

// the stuff in here isnt Very Delta Time Friendly

// but it needs to be changed on Frame

//This is just a quick fix at the moment

Super.tick(deltaTime);



if(owner == none) {

 SlaveWeap.ReloadCount=class.Default.ReloadCount;

 SlaveWeap.ShotTime = class.Default.shotTime;

 ReloadCount = Class.Default.ReloadCount;

 ShotTime = class.Default.shotTime;

}

//added this because i maybe Changing the CrossHair Later on

/*SetCrossHairVis(bReplaceCrossHair);*/



if(slaveWeap != none && SlaveWeap.bHasMuzzleFlash)

	 SlaveWeap.EraseMuzzleFlashTexture();

}



function fire(float value)

{



if(bSlave) return;

Super.Fire(value);





}



simulated function PlaySelectiveFiring()

{

local Pawn aPawn;

local float rnd;

local Name anim;



anim = 'Shoot';



if (bHandToHand)

{

 rnd = FRand();

 if (rnd < 0.33)

	 anim = 'Attack';

 else if (rnd < 0.66)

	 anim = 'Attack2';

 else

	 anim = 'Attack3';

}

  if(WeapUSed==0 || SlaveWeap==None){

if (( Level.NetMode == NM_Standalone ) || ( DeusExPlayer(Owner) == DeusExPlayer(GetPlayerPawn())) )

{

 if (bAutomatic)

	 LoopAnim(anim,, 0.1);

 else

	 PlayAnim(anim,,0.1);

}

else if ( Role == ROLE_Authority )

{

 for ( aPawn = Level.PawnList; aPawn != None; aPawn = aPawn.nextPawn )

 {

	 if ( aPawn.IsA('DeusExPlayer') && ( DeusExPlayer(Owner) != DeusExPlayer(aPawn) ) )

	 {

   // If they can't see the weapon, don't bother

   if ( DeusExPlayer(aPawn).FastTrace( DeusExPlayer(aPawn).Location, Location ))

  	 DeusExPlayer(aPawn).ClientPlayAnimation( Self, anim, 0.1, bAutomatic );

	 }

 }

}

 }

 Else {

   if (( Level.NetMode == NM_Standalone ) || ( DeusExPlayer(Owner) == DeusExPlayer(GetPlayerPawn())) )

{

 if (bAutomatic)

	 SlaveWeap.LoopAnim(anim,, 0.1);

 else

	 SlaveWeap.PlayAnim(anim,,0.1);

}

else if ( Role == ROLE_Authority )

{

 for ( aPawn = Level.PawnList; aPawn != None; aPawn = aPawn.nextPawn )

 {

	 if ( aPawn.IsA('DeusExPlayer') && ( DeusExPlayer(Owner) != DeusExPlayer(aPawn) ) )

	 {

   // If they can't see the weapon, don't bother

   if ( DeusExPlayer(aPawn).FastTrace( DeusExPlayer(aPawn).Location, Location ))

  	 DeusExPlayer(aPawn).ClientPlayAnimation( Self, anim, 0.1, bAutomatic );

	 }

 }

}

 }

   if(WeapUsed==1)

	 WeapUsed=0;

 else

	 WeapUsed=1;

}



Function TweenDown()

{

Super.TweenDown();

/*bReplaceCrossHair = False;*/

if(SlaveWeap != none)

 SlaveWeap.TweenDown();

}



function PlaySelect()

{

PlayAnim('Select',1.0,0.0);

if(SlaveWeap!=None)

 SlaveWeap.PlayAnim('Select',1.0,0.0);

Owner.PlaySound(SelectSound, SLOT_Misc, Pawn(Owner).SoundDampening);	

}



function BringUp()

{

if(SlaveWeap!=None)

 SlaveWeap.SetHand(1);



Super.BringUp();

}



simulated event RenderOverlays( canvas Canvas )

{

local rotator NewRot;



Super.RenderOverlays(Canvas);

if(SlaveWeap!=None) {

 NewRot=Pawn(Owner).ViewRotation;

 newRot.Roll=Default.Rotation.Roll;

 SlaveWeap.setRotation(newRot);

 SlaveWeap.SetLocation(Owner.Location+SlaveWeap.CalcDrawOffset());

 Canvas.DrawActor(SlaveWeap, false);

}

}



function bool HandlePickupQuery( inventory Item )

{

local int OldAmmo;

local Pawn P;



if (Item.Class == Class)

{

 if ( (Weapon(item).bWeaponStay && SlaveWeap!=None) && (!Weapon(item).bHeldItem || Weapon(item).bTossedOut) )

	 return true;

 P = Pawn(Owner);



 if ( AmmoType != None )

 {

	 OldAmmo = AmmoType.AmmoAmount;

	 if ( AmmoType.AddAmmo(PickupAmmoCount) && (OldAmmo == 0) 

   && (P.Weapon.class != item.class) && !P.bNeverSwitchOnPickup )

  	 WeaponSet(P);

 }



 if(!bDual && SecondpickupMsg != ""){

	 p.clientMessage(SecondPickupMsg);

 }



 if (SlaveWeap==None) {

	 SlaveWeap=Spawn(class<DoubleWeapBase>(DynamicLoadObject(String(item.class), class'Class')));

	 SlaveWeap.BecomeItem();

	 SlaveWeap.SetOwner(Owner);

	 SlaveWeap.bSlave=True;

	 SlaveWeap.setHand(69);

	 SlaveWeap.ReloadCount=class.Default.ReloadCount;

	 SlaveWeap.ShotTime = class.Default.shotTime;

	 ReloadCount = Class.Default.ReloadCount * 2;

	 SlaveWeap.BringUp();

	 bDual=True;

	 SetHand(69);

 }



 Item.PlaySound(Item.PickupSound);

 Item.SetRespawn();   

 return true;

}

if ( Inventory == None )

 return false;



return Inventory.HandlePickupQuery(Item);

}



function DropFrom(vector StartLocation)

{

if(SLaveWeap!=None)

 SlaveWeap.DropFrom(StartLocation);

SlaveWeap.bSlave=False;

bDual=False;

bSlave=False;

SlaveWeap=None;

Super.DropFrom(StartLocation);

}



// Finish a firing sequence (ripped off and modified from EngineWeapon.uc)

function Finish()

{

local Pawn PawnOwner;



if ( bChangeWeapon )

{

 GotoState('DownWeapon');

 return;

}



PawnOwner = Pawn(Owner);

if ( PawnOwner == None )

 return;

if ( PlayerPawn(Owner) == None )

{

 if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) )

 {

	 PawnOwner.StopFiring();

	 PawnOwner.SwitchToBestWeapon();

	 if ( bChangeWeapon )

   GotoState('DownWeapon');

 }

// Removed this as it would have stopped the slave from Reloading

//  else if ( (PawnOwner.bFire != 0) && (FRand() < RefireRate) )

// 	 Global.Fire(0);

//  else if ( (PawnOwner.bAltFire != 0) && (FRand() < AltRefireRate) )

// 	 Global.AltFire(0);	

//  else 

//  {

// 	 PawnOwner.StopFiring();

// 	 GotoState('Idle');

//  }

 return;

}

if ( ((AmmoType != None) && (AmmoType.AmmoAmount<0> 0))

	 {

   if (PlayerPawn(Owner) != None)

  	 Global.Fire(0);

   else  {

  	 GotoState('FinishFire');

   }

	 }

	 else {

   GotoState('FinishFire');

	 }

 }

 else

 {

	 // if we are a thrown weapon and we run out of ammo, destroy the weapon

	 if (bHandToHand && (ReloadCount > 0) && (AmmoType.AmmoAmount <0>= ReloadCount) && (ReloadCount != 0))

{

 if (!bAutomatic)

 {

	 bFiring = False;

	 FinishAnim();

 }



 if (Owner != None)

 {

	 if (Owner.IsA('DeusExPlayer'))

	 {

   bFiring = False;



   // should we autoreload?

   if (DeusExPlayer(Owner).bAutoReload)

   {

  	 // auto switch ammo if we're out of ammo and

  	 // we're not using the primary ammo

  	 if ((AmmoType.AmmoAmount == 0) && (AmmoName != AmmoNames[0])) {

     CycleAmmo();

     SlaveWeap.CycleAmmo();

  	 }

  	 SlaveWeap.ReloadAmmo();

  	 ReloadAmmo();

   }

   else

   {

  	 if (bHasMuzzleFlash) {

     EraseMuzzleFlashTexture();

  	 }

  	 if(SlaveWeap.bHasMuzzleFlash) {

     SlaveWeap.EraseMuzzleFlashTexture();

  	 }

  	 GotoState('Idle');

   }

	 }

	 else if (Owner.IsA('ScriptedPawn'))

	 {

   bFiring = False;

   ReloadAmmo();

	 }

 }

 else

 {

	 if (bHasMuzzleFlash) {

  	 EraseMuzzleFlashTexture();

   }

	 if(SlaveWeap.bHasMuzzleFlash) {

  	 SlaveWeap.EraseMuzzleFlashTexture();

	 }

	 GotoState('Idle');

 }

}

//	if ( bAutomatic && (( Level.NetMode == NM_DedicatedServer ) || ((Level.NetMode == NM_ListenServer) && Owner.IsA('DeusExPlayer') && !DeusExPlayer(Owner).PlayerIsListenClient())))

//  GotoState('Idle');



Sleep(GetShotTime());

if (bAutomatic)

{

 GenerateBullet();	// In multiplayer bullets are generated by the client which will let the server know when

 Goto('Begin');

}

bFiring = False;

FinishAnim();



// if ReloadCount is 0 and we're not hand to hand, then this is a

// single-use weapon so destroy it after firing once

if ((ReloadCount == 0) && !bHandToHand)

{

 if (DeusExPlayer(Owner) != None)

	 DeusExPlayer(Owner).RemoveItemFromSlot(Self);   // remove it from the inventory grid

 Destroy();

}

ReadyToFire();

Done:

bFiring = False;

Finish();

}

// modifyed reload State so that the Second Weapon looks as if it is reloading

state Reload

{

ignores Fire, AltFire;



function float GetReloadTime()

{

 local float val;



 val = ReloadTime;



 if (ScriptedPawn(Owner) != None)

 {

	 val = ReloadTime * (ScriptedPawn(Owner).BaseAccuracy*2+1);

 }

 else if (DeusExPlayer(Owner) != None)

 {

	 // check for skill use if we are the player

	 val = GetWeaponSkill();

	 val = ReloadTime + (val*ReloadTime);

 }



 return val;

}



function NotifyOwner(bool bStart)

{

 local DeusExPlayer player;

 local ScriptedPawn pawn;



 player = DeusExPlayer(Owner);

 pawn   = ScriptedPawn(Owner);



 if (player != None)

 {

	 if (bStart)

   player.Reloading(self, GetReloadTime()+(1.0/AnimRate));

	 else

	 {

   player.DoneReloading(self);

	 }

 }

 else if (pawn != None)

 {

	 if (bStart)

   pawn.Reloading(self, GetReloadTime()+(1.0/AnimRate));

	 else

   pawn.DoneReloading(self);

 }

}



Begin:

FinishAnim();



// only reload if we have ammo left

if (AmmoType.AmmoAmount > 0)

{

 if (( Level.NetMode == NM_DedicatedServer ) || ((Level.NetMode == NM_ListenServer) && Owner.IsA('DeusExPlayer') && !DeusExPlayer(Owner).PlayerIsListenClient()))

 {

	 ClientReload();

	 Sleep(GetReloadTime());

	 ReadyClientToFire( True );

 }

 else

 {

	 bWasZoomed = bZoomed;

	 if (bWasZoomed)

   ScopeOff();



	 Owner.PlaySound(CockingSound, SLOT_None,,, 1024);  // CockingSound is reloadbegin

	 // Added to Make it look like the SlaveWeapon HasReloaded as well

	 if(SlaveWeap != none) {

	 PlayAnim('ReloadBegin');

	 SlaveWeap.PlayAnim('ReloadBegin');

	 NotifyOwner(True);

	 FinishAnim();

	 LoopAnim('Reload');

	 SlaveWeap.LoopAnim('Reload');

	 Sleep(GetReloadTime());

	 Owner.PlaySound(AltFireSound, SLOT_None,,, 1024);  // AltFireSound is reloadend

	 PlayAnim('ReloadEnd');

	 SlaveWeap.PlayAnim('ReloadEnd');

	 FinishAnim();

	 NotifyOwner(False);



	 if (bWasZoomed)

   ScopeOn();



	 ClipCount = 0;

	 } Else {

	 PlayAnim('ReloadBegin');

	 NotifyOwner(True);

	 FinishAnim();

	 LoopAnim('Reload');

	 Sleep(GetReloadTime());

	 Owner.PlaySound(AltFireSound, SLOT_None,,, 1024);  // AltFireSound is reloadend

	 PlayAnim('ReloadEnd');

	 FinishAnim();

	 NotifyOwner(False);



	 if (bWasZoomed)

   ScopeOn();



	 ClipCount = 0;

	 }

 }

}

WeapUsed=0;

GotoState('Idle');

}

DefaultProperties

{



SecondPickupMsg=«TIME TO CLEAN HOUSE»

}

Ссылка на комментарий
  • 2 недели спустя...
  • 1 месяц спустя...

Я на днях написала код для альт. режима атаки.

 

Вообще-то сделать этот альтернативный режим оказалось просто--надо взять функцию FIRE, сделать ее копию и переименовать в AltFire.

 

И мне было нужно чтобы при разных режимах наносились разные типы повреждений. С огнестрельным оружием это просто но вот если HandToHand--тут пришлось подумать.

 

И я добавила две переменных, изменяющих свое значение при разных режимах.

 

Код при этом выглядит так :D :

 


//=============================================================================
// AV_Crowbar. Copyright © Андриевская Вероника.
//=============================================================================

class AV_Crowbar expands WeaponCrowbar;

// Это очень важно, эти переменные хранят информацию!
var bool b_UseAltFireMode; //TRUE если альт. атака
var bool b_UseFireMode; // TRUE если первичная атака.


//-----------------------------------------------------------------------------
// Первичная атака--обычные удары и сбоку.
//-----------------------------------------------------------------------------
simulated function PlaySelectiveFiring()
{
local Pawn aPawn;
local float rnd;
local Name anim;

// У нас первичная атака, поэтому:
b_UseFireMode=true;
b_UseAltFireMode=false;
// —------------------------------

anim = 'Shoot';

if (bHandToHand)
{
	rnd = FRand();
	if (rnd < 0.33)
		anim = 'Attack';
	else if (rnd < 0.66)
		anim = 'Attack2';
	else
		anim = 'Attack';

// Анимацию «Attack3» я убрала 8) Ее я зарезервировала для альтернативной атаки.
}

if (( Level.NetMode == NM_Standalone ) || ( DeusExPlayer(Owner) == DeusExPlayer(GetPlayerPawn())) )
{
	if (bAutomatic)
		LoopAnim(anim,, 0.1);
	else
		PlayAnim(anim,,0.1);
}
else if ( Role == ROLE_Authority )
{
	for ( aPawn = Level.PawnList; aPawn != None; aPawn = aPawn.nextPawn )
	{
		if ( aPawn.IsA('DeusExPlayer') && ( DeusExPlayer(Owner) != DeusExPlayer(aPawn) ) )
		{
			// If they can't see the weapon, don't bother
			if ( DeusExPlayer(aPawn).FastTrace( DeusExPlayer(aPawn).Location, Location ))
				DeusExPlayer(aPawn).ClientPlayAnimation( Self, anim, 0.1, bAutomatic );
		}
	}
}
}

//-----------------------------------------------------------------------------
// Вторичный режим атаки: удар сверху и «усыпляющий», типа как дубинка ;)
//-----------------------------------------------------------------------------
simulated function PlaySelectiveAltFiring()
{
local Pawn aPawn;
local float rnd;
local Name anim;

// Это вторичная атака, поэтому:
b_UseFireMode=False;
b_UseAltFireMode=True;
// —----------------------------

anim = 'Shoot';

if (bHandToHand)
{
		anim = 'Attack3'; // Удар сверху
}

if (( Level.NetMode == NM_Standalone ) || ( DeusExPlayer(Owner) == DeusExPlayer(GetPlayerPawn())) )
{
	if (bAutomatic)
		LoopAnim(anim,, 0.1);
	else
		PlayAnim(anim,,0.1);
}
else if ( Role == ROLE_Authority )
{
	for ( aPawn = Level.PawnList; aPawn != None; aPawn = aPawn.nextPawn )
	{
		if ( aPawn.IsA('DeusExPlayer') && ( DeusExPlayer(Owner) != DeusExPlayer(aPawn) ) )
		{
			// If they can't see the weapon, don't bother
			if ( DeusExPlayer(aPawn).FastTrace( DeusExPlayer(aPawn).Location, Location ))
				DeusExPlayer(aPawn).ClientPlayAnimation( Self, anim, 0.1, bAutomatic );
		}
	}
}
}
//--
function AltFire(float Value)
{
local float sndVolume;
local bool bListenClient;

bListenClient = (Owner.IsA('DeusExPlayer') && DeusExPlayer(Owner).PlayerIsListenClient());

sndVolume = TransientSoundVolume;

if ( Level.NetMode != NM_Standalone )  // Turn up the sounds a bit in mulitplayer
{
	sndVolume = TransientSoundVolume * 2.0;
	if ( Owner.IsA('DeusExPlayer') && (DeusExPlayer(Owner).NintendoImmunityTimeLeft > 0.01) || (!bClientReady && (!bListenClient)) )
	{
		DeusExPlayer(Owner).bJustFired = False; //
		bReadyToFire = True;
		bPointing = False;
		bFiring = False; //



		return;
	}
}
// check for surrounding environment
if ((EnviroEffective == ENVEFF_Air) || (EnviroEffective == ENVEFF_Vacuum) || (EnviroEffective == ENVEFF_AirVacuum))
{
	if (Region.Zone.bWaterZone)
	{
		if (Pawn(Owner) != None)
		{
			Pawn(Owner).ClientMessage(msgNotWorking);
			if (!bHandToHand)
				PlaySimSound( Misc1Sound, SLOT_None, sndVolume, 1024 );		// play dry fire sound
		}
		GotoState('Idle');
		return;
	}
}


if (bHandToHand)
{
	if (ReloadCount > 0)
		AmmoType.UseAmmo(1);

	if (( Level.NetMode != NM_Standalone ) && !bListenClient )
		bClientReady = False;
	bReadyToFire = False;
	GotoState('NormalFire');
	bPointing=True;



	if ( Owner.IsA('PlayerPawn') )
		PlayerPawn(Owner).PlayFiring();
	PlaySelectiveAltFiring(); //


	PlayFiringSound();
}
// if we are a single-use weapon, then our ReloadCount is 
// 0 and we don't use ammo
else if ((ClipCount < ReloadCount) || (ReloadCount == 0))
{
	if ((ReloadCount == 0) || AmmoType.UseAmmo(1))
	{
		if (( Level.NetMode != NM_Standalone ) && !bListenClient )
			bClientReady = False;

		ClipCount++;
		bFiring = True; //


		bReadyToFire = False;
		GotoState('NormalFire');
		if (( Level.NetMode == NM_Standalone ) || ( Owner.IsA('DeusExPlayer') && DeusExPlayer(Owner).PlayerIsListenClient()) )
		{
			if ( PlayerPawn(Owner) != None )		// shake us based on accuracy
				PlayerPawn(Owner).ShakeView(ShakeTime, currentAccuracy * ShakeMag + ShakeMag, currentAccuracy * ShakeVert);
		}
		bPointing=True;
		if ( bInstantHit )
			TraceFire(currentAccuracy);
		else
			ProjectileFire(ProjectileClass, ProjectileSpeed, bWarnTarget);

		if ( Owner.IsA('PlayerPawn') )
			PlayerPawn(Owner).PlayFiring();
		// Don't play firing anim for 20mm
		if ( Ammo20mm(AmmoType) == None )
			PlaySelectiveAltFiring(); //
		PlayFiringSound();
		if ( Owner.bHidden )
			CheckVisibility();
	}
	else
		PlaySimSound( Misc1Sound, SLOT_None, sndVolume, 1024 );		// play dry fire sound
}
else
	PlaySimSound( Misc1Sound, SLOT_None, sndVolume, 1024 );		// play dry fire sound

// Update ammo count on object belt
if (DeusExPlayer(Owner) != None)
	DeusExPlayer(Owner).UpdateBeltText(Self);
}

//-----------------------------------------------------------------------------
// Здесь мы раздаем разные повреждения при разных режимах!
//-----------------------------------------------------------------------------
function name WeaponDamageType()
{
if (b_UseAltFireMode)
return 'KnockedOut'; // Они уснут и даже не заметят!!!!!!!!!!!!!!!

 else

 if (b_UseFireMode)
return 'Shot';  // Ну в принципе можно 
								// сюда вставить и 'Exploded' вот только нужно-ли? :D)))))
}



defaultproperties
{
    HitDamage=20
    BobDamping=0.800000 // размахивание оружием при ходьбе
    Description=«Удар этой металлической штукой может быть смертелен в руках мастера. Ударив по голове сверху (альтернативный огонь), вы скорее всего отключите жертву, ударив сбоку--вероятно нанесете сильный урон (первичный огонь).|n|n<ПРИМЕЧАНИЕ AV:>Вообще-то этой штукой вытаскивают гвозди, но похоже что нынче это мало кто знает :D<КОНЕЦ ПРИМЕЧАНИЯ>»
}

 

Примечание: нужно редактировать файл User.ini чтобы назначить альтернативный режим атаки на левую кнопку мыши (правая--первичный режим)

Вот мой отредактированный файл и готовый мод, поместите их в папку DeusEx\SYSTEM\, в игре нажмите T и введите:

 

Summon AV_CrowBar.av_crowBar

 

Сначала надо сделать резервную копию своего файла USER.ini

 

 

 

AV_CrowBar.zip

Ссылка на комментарий

Примечание: нужно редактировать файл User.ini чтобы назначить альтернативный режим атаки на левую кнопку мыши (правая--первичный режим)

Обычно народ путает левую и правую.

Ссылка на комментарий

Не так давно я столкнулась с такой проблемой: при смене уровня у оружия пропадал звук выстрела. Причем только у того оружия--которое имеет значение bInstantHit=FALSE, то есть выстреливает Projectiles (снаряды). Внимательно посмотрев скрипт DeusExWeapon.uc я увидела такое:

 

function TravelPostAccept()
{
local int i;

Super.TravelPostAccept();

// make sure the AmmoName matches the currently loaded AmmoType
if (AmmoType != None)
	AmmoName = AmmoType.Class;

if (!bInstantHit)
{
	if (ProjectileClass != None)
		ProjectileSpeed = ProjectileClass.Default.speed;

	// make sure the projectile info matches the actual AmmoType
	// since we can't "var travel class" (AmmoName and ProjectileClass)
	if (AmmoType != None)
	{
		FireSound = None; // ЗАЧЕМ ЭТО?
		for (i=0; i<ArrayCount(AmmoNames); i++)
		{
			if (AmmoNames[i] == AmmoName)
			{
				ProjectileClass = ProjectileNames[i];
				break;
			}
		}
	}
}
}



 

так выглядит исправленная версия кода:

 


function TravelPostAccept()
{
local int i;

Super.TravelPostAccept();

// make sure the AmmoName matches the currently loaded AmmoType
if (AmmoType != None)
	AmmoName = AmmoType.Class;

if (!bInstantHit)
{
	if (ProjectileClass != None)
		ProjectileSpeed = ProjectileClass.Default.speed;

	// make sure the projectile info matches the actual AmmoType
	// since we can't "var travel class" (AmmoName and ProjectileClass)
	if (AmmoType != None)
	{
		FireSound = Default.FireSound; // ВОТ ЭТО!
		for (i=0; i<ArrayCount(AmmoNames); i++)
		{
			if (AmmoNames[i] == AmmoName)
			{
				ProjectileClass = ProjectileNames[i];
				break;
			}
		}
	}
}
}



 

Исправленный код необходимо вписать в класс оружия и тогда при смене уровня звук выстрела пропадать не будет. Проверено неоднократно 8)

 

ПРИМЕЧАНИЕ: Оружие оригинального DeusEx тут ни причем, только собственное.

Ссылка на комментарий
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...