LoadLine Calibration Опубликовано: 15 сентября 2006 Автор Опубликовано: 15 сентября 2006 Сегодня я весь день протрахалась (иначе не скажешь) с классом 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 }
LoadLine Calibration Опубликовано: 15 сентября 2006 Автор Опубликовано: 15 сентября 2006 А что оно делает? Можно установить Длинный звук выстрела (в моем случае -- длинная очередь). Я что-то не поняла твоего вопроса :)
Дед Опубликовано: 15 сентября 2006 Опубликовано: 15 сентября 2006 А в нём не решена такая проблема? Кол-во проигрываний звука привязано к анимации выстрела. Т.е. чтобы сделать полноценную систему "один патрон-выстрел - один звук", нужно делать анимацию очень короткой (так сделано в Cassandra project), что выглядит очень некрасиво, да и уже существующие модели не переделать.
LoadLine Calibration Опубликовано: 15 сентября 2006 Автор Опубликовано: 15 сентября 2006 Не знаю... Мне нужно было чтобы был длинный звук и я это решила. Возьми да попробуй. Мне мой готовый пак пока выложить нет возможности.
LoadLine Calibration Опубликовано: 18 сентября 2006 Автор Опубликовано: 18 сентября 2006 ЯЧС спросил у меня как делаються лестницы (вертикальные). Я решила написать здесь, так как другим возможно тоже будет интересно.Нужно просто сделать лестницу из текстуры в группе Ladder в текстурпаке CoreTexMatal.utx. Нужна текстура именно из группы Ladder Можно создать свой текстурпак со своей текстурой лестницы, при импорте надо указать что она будет в группе Ladder. Обо все этом написано в документации по редактору :wink: Вот карта-пример: http://veronika-and.nm.ru/Ladder_test.zip
LoadLine Calibration Опубликовано: 29 сентября 2006 Автор Опубликовано: 29 сентября 2006 Сегодня нашла у себя в папке со скаченными файлами довольно интересный скрипт. Если взять любое оружие и объявить его подклассом 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» }
LoadLine Calibration Опубликовано: 11 ноября 2006 Автор Опубликовано: 11 ноября 2006 Я на днях написала код для альт. режима атаки. Вообще-то сделать этот альтернативный режим оказалось просто--надо взять функцию 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
Kronos Опубликовано: 11 ноября 2006 Опубликовано: 11 ноября 2006 Примечание: нужно редактировать файл User.ini чтобы назначить альтернативный режим атаки на левую кнопку мыши (правая--первичный режим)Обычно народ путает левую и правую.
LoadLine Calibration Опубликовано: 15 ноября 2006 Автор Опубликовано: 15 ноября 2006 Не так давно я столкнулась с такой проблемой: при смене уровня у оружия пропадал звук выстрела. Причем только у того оружия--которое имеет значение 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 тут ни причем, только собственное.
Рекомендованные сообщения