При попадании в павн HitWall запускатса не должен.
Чет бред какой-то...
Цитата
Не роботает?
Нет, смотри код, мож я далб***б?
class PROJ_IspolinAP extends DKProjectile;
var vector Dir;
var FX_FireEffect_Ispolin Fire; var FX_Tracer_IspolinAP Tracer;
simulated function PostBeginPlay() { Fire = Spawn(class'FX_FireEffect_Ispolin',self,,Location); Tracer = Spawn(class'FX_Tracer_IspolinAP',self,,Location);
В HitWall - я воткнул 2й трасер которые спавнится сразу после того как 1й трасер исчезает и летит как рикошет.
Если в експлоде прописать дестрой, то проектиль исчезает, но не дитонирует, не наносит урона и не воспроизводит эффект взрыва.
Еще, ты наверно не понял, танк не павн как бы, павн это центр танка, а колозия на нем, защищает как брона и помойму не является павном, так что на прямую проектиль не касается павна. (если я правильно все понял)
Infinite War v5.0.2 construction UIP 2.0 - UIPP(UIP 2.1)
Сообщение отредактировал UberSoldier - Суббота, 09 Январь 16, 01:06
Хех.. ну в конце hitwall у тебя запускаетса explode, а в explode есть один только destroy . Какая причина наследовать "DKProjectile" а не стандартный? Какие в нем отличия от стандартного? Спрашиваю, так как process touch у тебя не прописана, тоесть либо стандартная, либо измененная из этого "DKProjectile". В стандартной функцыи process toucch запускаетса как раз только Explode, в котором у тебя только destroy. Посмотри что запускает process toucch в DKProjectile (и есть ли она там вообще), и так по цепочке до стандартного. И где? у тебя эфекты взрыва спавнятса не вижу.
Добавлено (09 Января 16, 01:44) ---------------------------------------------
ЦитатаUberSoldier ()
танк не павн как бы
Вся модель, которая utx это павн. Разве-что ты на него панелей понавешывал левого какого-то класа. Кажысь проблемы с этим DKprojectile, ибо не извесно до конца как он там роботает. Может там надо Super.xxx... везде вызывать.
function float SurfaceScale (int Surf, out byte bHard) { switch (Surf) { Case 0:/*EST_Default*/ return 1; Case 1:/*EST_Rock*/ return 1; Case 2:/*EST_Dirt*/ return 1; Case 3:/*EST_Metal*/ return 1; Case 4:/*EST_Wood*/ return 1; Case 5:/*EST_Plant*/ return 1; Case 6:/*EST_Flesh*/ return 1; Case 7:/*EST_Ice*/ return 1; Case 8:/*EST_Snow*/ return 1; Case 9:/*EST_Water*/ return 1; Case 10:/*EST_Glass*/ return 1; default: return 1; } }
class BallisticProjectile extends Projectile abstract config(BallisticProMainOff);
var() class<BCImpactManager>ImpactManager; // Impact manager to spawn on final hit var() class<BCImpactManager>PenetrateManager; // Impact manager to spawn when going through actors var() bool bCheckHitSurface; // Check impact surfacetype on explode for surface dependant ImpactManagers var() bool bPenetrate; // Will go through enemies var() bool bRandomStartRotaion; // Set random roll on startup var() float AccelSpeed; // Acceleration speed var() float StartDelay; // Used to delay projectile's entry into the world var() class<Actor> TrailClass; // Actor to use for trail var Actor Trail; // The trail Actor var() Vector TrailOffset; // Offset from location at which to spawn trail var() class<DamageType> MyRadiusDamageType; // DamageType to use for splash damage var actor HitActor; // Actor that got hit directly var bool bCanHitOwner; // Bounced or turned around or something so it can hit owner var bool bExploded; // Already Blown up. Used by troublesome rocekts that keep going off on clients var() bool bTearOnExplode; // If !bNetTemporary, tear this projectile off when it explodes var() float NetTrappedDelay; // How long to remain in nettrapped state before being destroyed var() bool bUsePositionalDamage; // Enable damage variation depending on hitlocation
var() float DamageHead; // Damage for headshots var() float DamageLimb; // Damage for limb shots var() globalconfig float DamageModHead, DamageModLimb; //Configurable damage modifiers for base damage var() class<DamageType> DamageTypeHead; // Damagetype for headshots var() class<DamageType> DamageTypeLimb; // Damagetype for limbshots
var() class<BCImpactManager>SplashManager; // Impact manager to spawn for splashes var() float ShakeRadius; // Shake the view of players withing this radius when Exploding var() bool bWarnEnemy; // Warn enemies that it's coming for em var() float MotionBlurRadius; var() float MotionBlurFactor; var() float MotionBlurTime;
var() bool bCoverPenetrator; // camera shakes // var() vector ShakeRotMag; // how far to rot view var() vector ShakeRotRate; // how fast to rot view var() float ShakeRotTime; // how much time to rot the instigator's view var() vector ShakeOffsetMag; // max view offset vertically var() vector ShakeOffsetRate; // how fast to offset view vertically var() float ShakeOffsetTime; // how much time to offset view
var Vector TearOffHitNormal;
replication { reliable if (bTearOff && Role == ROLE_Authority) TearOffHitNormal; }
// Initialize projectile stuff. This will be delayed by StartDelay simulated function InitProjectile () { InitEffects(); }
// When start delay ends, set all the properties that make it visible simulated function Timer() { if (StartDelay > 0) { StartDelay = 0; SetPhysics(default.Physics); bDynamicLight=default.bDynamicLight; bHidden=false; InitProjectile(); return; } } // Returns false so that physics volumes don't play any sounds simulated function bool CanSplash() { return false; // return bReadyToSplash; }
simulated function PhysicsVolumeChange( PhysicsVolume NewVolume ) { local Actor A; local vector HitLoc, HitNorm, Start, End; if (SplashManager != None && bReadyToSplash && NewVolume.bWaterVolume) { Start = Location - Velocity*(Level.TimeSeconds - LastRenderTime); End = Location; bTraceWater=true; A = Trace(HitLoc, HitNorm, End, Start, true); bTraceWater=false; if (A != NewVolume) HitLoc = Start; SplashManager.static.StartSpawn(HitLoc, Normal(-Velocity), 9, Instigator); } }
simulated function CheckSurface(vector StartLocation, vector StartNormal, out int Surf, optional out Actor Wall) { local Vector HitLoc, HitNorm; local Material HitMaterial;
// Returns the amount by which MaxWallSize should be scaled for each surface type. Override in subclasses to change... function float SurfaceScale (int Surf, out byte bHard) //hurp durp you can't have an out bool. { switch (Surf) { Case 0:/*EST_Default*/ bHard = 1; return 0.5; Case 1:/*EST_Rock*/ bHard = 1; return 0.5; Case 2:/*EST_Dirt*/ return 0.35; Case 3:/*EST_Metal*/ bHard = 1; return 0.25; Case 4:/*EST_Wood*/ return 0.55; Case 5:/*EST_Plant*/ return 0.5; Case 6:/*EST_Flesh*/ return 1; Case 7:/*EST_Ice*/ bHard=1;return 0.75; Case 8:/*EST_Snow*/ return 1; Case 9:/*EST_Water*/ return 1; Case 10:/*EST_Glass*/ return 1; default: bHard = 1; return 0.5; } }
// Spawn impact effects, run BlowUp() and then die. simulated function Explode(vector HitLocation, vector HitNormal) { local int Surf;
if (bExploded) return;
if (ShakeRadius > 0 || MotionBlurRadius > 0) ShakeView(HitLocation);
if (ImpactManager != None && level.NetMode != NM_DedicatedServer) { if (bCheckHitSurface) CheckSurface(HitLocation, HitNormal, Surf); if (Instigator == None) ImpactManager.static.StartSpawn(HitLocation, HitNormal, Surf, Level.GetLocalPlayerController()/*.Pawn*/); else ImpactManager.static.StartSpawn(HitLocation, HitNormal, Surf, Instigator); }
simulated function DoDamage(Actor Other, vector HitLocation) { local class<DamageType> DT; local float Dmg; local Vector ClosestLocation, BoneTestLocation, temp;
if (xPawn(Other) != None) { //Find a point on the victim's Z axis at the same height as the HitLocation. ClosestLocation = Other.Location; ClosestLocation.Z += (HitLocation - Other.Location).Z;
//Extend the hit along the projectile's Velocity to a point where it is closest to the victim's Z axis. temp = Normal(Velocity); temp *= VSize(ClosestLocation - HitLocation); BoneTestLocation = temp; BoneTestLocation *= normal(ClosestLocation - HitLocation) dot normal(temp); BoneTestLocation += HitLocation;
simulated function bool CanPenetrate(Actor Other) { if (!bPenetrate || Other == None || Other.bWorldGeometry || Mover(Other) != None || Vehicle(Other) != None || DestroyableObjective(Other) != None) return false; return true; } simulated function Actor GetDamageVictim (Actor Other, vector HitLocation, vector Dir, out float Dmg, optional out class<DamageType> DT) { local string Bone; local float BoneDist; local Vector HitLocationMatchZ; local Pawn DriverPawn;
Dmg = Damage; DT = MyDamageType;
if (!bUsePositionalDamage || Monster(Other) != None) return Other;
if (Pawn(Other) != None) { if (Vehicle(Other) != None) { // Try to relieve driver of his head... DriverPawn = Vehicle(Other).CheckForHeadShot(HitLocation, Dir, 1.0); if (DriverPawn != None) { Other = DriverPawn; Dmg = DamageHead;
if (DamageTypeHead != None) DT = DamageTypeHead; } }
// Check for head shot Bone = string(Other.GetClosestBone(HitLocation, Dir, BoneDist, 'head', 10)); if (InStr(Bone, "head") > -1)
{ if (class'BallisticWeapon'.default.bUseModifiers) Dmg *= DamageModHead; else Dmg = DamageHead;
if (DamageTypeHead != None) DT = DamageTypeHead; }
// Limb shots else if (HitLocation.Z < Other.Location.Z - (Other.CollisionHeight/6) || VSize(HitLocationMatchZ - Other.Location) > 22) //accounting for groin region here { if (class'BallisticWeapon'.default.bUseModifiers) Dmg *= DamageModLimb; else if(class'BallisticWeapon'.default.bEvenBodyDamage) { Dmg = Damage; } else Dmg = DamageLimb;
if (DamageTypeLimb != None) DT = DamageTypeLimb; } } }
return Other; }
// Special HurtRadius function. This will hurt everyone except the chosen victim. // Useful if you want to spare a directly hit enemy from the radius damage function TargetedHurtRadius( float DamageAmount, float DamageRadius, class<DamageType> DamageType, float Momentum, vector HitLocation, Optional actor Victim ) { local actor Victims; local float damageScale, DmgRadiusScale, dist; local vector dir;
if( bHurtEntry ) return;
bHurtEntry = true; foreach CollidingActors( class 'Actor', Victims, DamageRadius, HitLocation ) { // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Victims.Role == ROLE_Authority) && (!Victims.IsA('FluidSurfaceInfo')) && Victims != Victim && Victims != HurtWall) { //Cover penetration code for explosives. if (!FastTrace(Victims.Location, Location)) { if (!bCoverPenetrator) continue; else DmgRadiusScale = (DamageRadius - GetCoverReductionFor(Victims.Location)) / DamageRadius;
function float GetCoverReductionFor(vector TargetLoc) { local Vector HitLocation, HitLocationTwo, HitNormal; local Material HitMat; local float MatScale, Dist; local byte bHard;
Ну вот видищ, в Explode там много делаетса, а мы его переопределили без строчки Super.Explode()... короче так как мы там ничего не меняем, функцыю Explode из твоего кода надо вообще выинуть (не оставить пустым, а вообще убрать, чтьоб роботала стандартная). В HitWall там тоже много чего делаетса в т.ч. и с эффектами, поэтому в конце HitWall добавляеш Super...:
Код
simulated function HitWall( vector HitNormal, actor Wall ) { local Vector VNorm; local Rotator NewRotation;
В моем коде, этт в проектиле снаряда? Если да, то все сделал, а толку не добавидось, всеравно рекашетит.
Если в код снаряда добавить процесс тоуч, то урон будет нонасится в любую часть танка, если нет, то учитыватся будет только радиус и если радиус взрыва мал, как например в моем снаряде, а это 176ед, то соответмтвенно в сам танк я напрямую никак не попаду, только радиусом, ибо дитонирует от колозии, но если колозия считается так же павном то в любом случае не работает, рикошет в обоих случаях происходит.
Кстати если вписать супер хит вал то моя система перестает работает, урон танку наносится в любую часть корпуса
Infinite War v5.0.2 construction UIP 2.0 - UIPP(UIP 2.1)
Сообщение отредактировал UberSoldier - Воскресенье, 10 Январь 16, 18:40
народ, подскажите где можно мутатор- таймер достать для ут2004 на серверах по триалу стоит такой, начинает время идти с момента респауна и останавливается тогда когда вражеским флагом касаешься о свой в (ctf) или юзаешь обж на (AS). Для того чтобы учиться быстрее пробегать по картам от точки к точке.
UberSoldier, ProcessTouch есть в коде BallisticProjectile, если ты его у себя прописываеш, то то тот ProcessTouch который в BallisticProjectile не исполняетса. Его надо запускать через Super.ProcessTouch, а ему в параметры вставлять значения переменных из своего processTouch. HitWall там тоже есть, и если у тебя с Super.HitWall(... перестает роботать, значит мешает тебе стандартный балистиковски код, который в HitWall.
ЦитатаUberSoldier ()
если колозия считается так же павном
Все что есьб коллизия модели то все есть павн, куда бы ты не попал. Исключение составляют пасажырские пушки, которые в отличии от пушки водителя идут отдельным павном. Как там в балистиковском коде ХЗ.
Если же ты хочеш определятса с рикошетом исходя из того, попал-ли танк в радиус поражения, то тут увы никак. Прямое попадание пожалуйста, можно спавнить в HitWall только если WorldGeometry, можно и в ProcessTouch, но там нет нормали и т.д. и т.п....
Код
simulated function HitWall( vector HitNormal, actor Wall ) { local Vector VNorm; local Rotator NewRotation;
Ну вот по этому коду работает норм, от всего рекошетит кроме павнов. Хмм, а как бы мне так замудрит с эффектом рекошета через обход, что бы спавнить его именно когда по танко попадают и он не получает урона, а когда получает не спавнится? Через тейк дамаг только если получил урон(
(Иногда, что бы понять сообщения ГП, мне нужно прочитать их около 15 раз и + 20мин на анализирование его мысли :D)
А так в общем, проще говоря, мне нужно заставть эффект не спавнится только когда танку наносится какой либо урон
Добавлено (11 Января 16, 00:01) --------------------------------------------- И еще, оч важно в насьройках колозии в анимации что озночают параметры? BlockKarma (в приндцапи понятно) BlockNonZeroExtent BlockZeroExtent
Infinite War v5.0.2 construction UIP 2.0 - UIPP(UIP 2.1)
Сообщение отредактировал UberSoldier - Понедельник, 11 Январь 16, 00:02
мне нужно заставть эффект не спавнится только когда танку наносится какой либо урон
сначала надо разобратса где это можно отследить. Через Takedamage не так сложно, определить что спавнить можно по DamageType-у, если он уникальный конешн. Dругое дело насколько у тебя все отличаетса от стандартного - по стадартному в DamageType много протаскиваетса через левые класы, там ReduceDamage и т.п., что узнать реальную величину урона будет достаточно сложно. Надо докопоать до места, где явно отнимаетса от Health, от того и плесать.
В тайк дамаге все от стандарта у меня, а вот в дамаг типе так: Базовый класс для ББ снарядов в котором собственно пока ни че нет:
class DT_AP extends BallisticDamageType;
defaultproperties { FemaleSuicide="%o minigunned her feet into tatters." MaleSuicide="%o minigunned his feet into tatters." bFastInstantHit=True KDamageImpulse=150000.000000 VehicleDamageScaling=1.000000 }
И родительский от баллистика
class BallisticDamageType extends WeaponDamageType config(BallisticProMainOff);
var() float EffectChance; // Chance of blood effect appearing var() class<BloodManager> BloodManager; // BloodManager loaded from BloodManagerName var() string BloodManagerName; // BloodManager to use for this damagetype var bool bCantLoadBlood; // No able to load BloodManager. So we know not to keep trying...
var int FlashThreshold; var vector FlashV; var float FlashF;
var() bool bCanBeBlocked; // This damage(eg. sword slash) can be blocked with a shield, sword or whatever... var() int ShieldDamage; // Damage this can do to shields that block it (for future mod purposses, used by JunkWar) var() bool bDetonatesBombs; // This damage can detonate bombs, mines, etc... var() bool bIgniteFires; // This damage can ignite flammable things and cause fires. var() byte ArmorHitType; // Tells BArmor what effects to use (Bullet, Misc or None) var() bool bSnipingDamage; // Ballistic Freon - extend camp check longer than normal var() bool bPowerPush; // 3SPN: Attacks of this damagetype impart a lot of momentum and are commonly used for abusive purposes var() bool bHeaddie; // Is a headshot damagetype var() bool bIgnoredOnLifts; //If used against a player on a lift, or exiting a lift, this damagetype will be ignored completely var() float InvasionDamageScaling; // Scale the damage by this in Invasion (because Invasion requires different balance to PvP) var string DamageIdent; // The stats slot this damagetype fits into var() bool bDisplaceAim; // This damagetype forcibly displaces the weapon if it hits var() int AimDisplacementDamageThreshold; var() float AimDisplacementDuration;
var globalconfig bool bSimpleDeathMessages; //Simplify DMs
var() string DamageDescription; // Words that describe this damagetype. e.g. ",Poison,Melee,Bite," or ",Electro,Lightning," // Makes it easier for systems to identify the damage and work accordingly... // Always seperate the keywords with commas like in examples!
/* This will be expanded upon later and implemented as the system develops and demand rises Some Standard Damage Description Words: ,Bullet, Done by ballistic bullet weapon, e.g. Pistol, Machinegun, Rifle, etc ,Shell, Done by shotgun shell, e.g. Shotgun shell... ,Flame, Done by fire, e.g. Flame thrower, Incendiary grenade, etc ,Explode, Done by explosion, e.g. Bomb, rocket, grenade ,Blunt, Done by blunt weapon, e.g. Baseball bat, Shotgun butt, South African bread ,Hack, Done by heavy hack style weapon, e.g. Axe ,Stab, Done by stab weapon, e.g. Knife, harpoon, spear, bayonette ,Slash, Done by swung blade weapon, e.g. Knife, Sword, Scythe ,Plasma, ,Laser, Laser type things ,Electro, Electical type damage like lightning ,RoadKill, Run down by a vehicle ,Gas, Done by poison gas, e.g. Deadly green gas, Deadly yellow gas, other deadly gasses... ,Liquid, Submerged in death ,Poison, Vic was poisoned by a damage that continued hurting after the hit ,Ice, Damage is cold and icy by nature. e.g. Freeze gun ,GearSafe, Doesn't tear into a victim or cut through armor and gas tanks, basically doesn't harm the gear, just the guy inside... Likely used with: Poison, Gas, Liquid ,Hazard, Done by hazardous weapon, ie. one that can easily damage the user. e.g. Explosives, grenades, fire, etc ,NonSniper, Not possible for this damage to be the result of marksmanship. eg. Traps, Mines, Bombs, Explosives */
var() class<BCImpactManager> ImpactManager; // Impact effects associated with this damage
// New gore system vars var() bool bMultiSever; // Don't just sever the hitbone, try the other bones too var() bool bOnlySeverLimbs; // Do not sever spine or pelvis, no matter how much damage var() bool bSeverPreventsBlood; // No blood hit effects if the bone was severed var() bool bNoSeverStumps; // Don't spawn attached stumps
// Motion blur caused by this damage var() float MinMotionBlurDamage; // Damage that must be done to start causing motion blur var() float MotionBlurDamageRange; // Damage amount beyond MinMotionBlurDamage at which max blur is acheived var() float MotionBlurFactor; // Amount of blur to apply. 0 None, 1 Full, >1 Stays full longer (scaled depending on damage) var() float MotionBlurTime; // How long blur is applied (also scaled depending on damage... obviously) var() bool bUseMotionBlur; // use motion blur effects for this DT
// This lets you put some his/her type words in the death messages // %ke: killer he/she // %ve: vicitm he/she // %km: killer him/her // %vm: vicitm him/her // %kh: killer his/her // %vh: vicitm his/her // %ks: killer himself/herself // %vs: vicitm himself/herself static function string Detag (string s, PlayerReplicationInfo Victim, PlayerReplicationInfo Killer) { local string kh, vh, vs, ks, km, vm, ve, ke;
if (Victim!=None && Victim.bIsFemale) { vh = default.Her; vs = default.Herself; vm = default.MHer; ve = default.She; } else { vh = default.His; vs = default.Himself; vm = default.Him; ve = default.He; } if (Killer != None && Killer.bIsFemale) { kh = default.Her; ks = default.Herself; km = default.MHer; ke = default.She; } else { kh = default.His; ks = default.Himself; km = default.Him; ke = default.He; }
Input = Text; Text = ""; i = InStr(Input, Replace); while(i != -1) { Text = Text $ Left(Input, i) $ With; Input = Mid(Input, i + Len(Replace)); i = InStr(Input, Replace); } Text = Text $ Input; }
// Random messages static function string DeathMessage(PlayerReplicationInfo Killer, PlayerReplicationInfo Victim) { local string s, t;
if (default.bSimpleDeathMessages) { if (default.WeaponClass == None) s = "%k ["$GetItemName(String(default.Class))$"] %o"; else { if(default.SimpleKillString == "") t = default.WeaponClass.default.ItemName; else t = default.SimpleKillString; if(default.HipString != "") t @= default.HipString; if (default.DamageIdent == "Melee" && default.WeaponClass.default.InventoryGroup != 1) t @= "Melee"; if (default.bHeaddie) t @= "Headshot"; s = "%k ["$t$"] %o"; } }
else if (default.DeathStrings.Length > 0) s = default.DeathStrings[Rand(default.DeathStrings.Length)]; else s = default.DeathString; return static.Detag(s, Victim, Killer); }
// Scoped death message (only for Simple DMs and with gametype support) static function string ScopedDeathMessage(PlayerReplicationInfo Killer, PlayerReplicationInfo Victim) { local string s, t;
if (default.WeaponClass == None) s = "%k ["$GetItemName(String(default.Class))$"] %o"; else { if(default.SimpleKillString == "") t = default.WeaponClass.default.ItemName; else t = default.SimpleKillString; if (default.DamageIdent == "Melee" && default.WeaponClass.default.InventoryGroup != 1) t @= "Melee"; t @= default.AimedString; if (default.bHeaddie) t @= "Headshot"; s = "%k ["$t$"] %o"; }
return static.Detag(s, Victim, Killer); }
static function string SuicideMessage(PlayerReplicationInfo Victim) { if (default.bSimpleDeathMessages) { if (default.WeaponClass == None) return "["$default.Class$"] %o"; if(default.SimpleKillString == "") return "["$default.WeaponClass.default.ItemName$"] %o"; return "["$default.SimpleKillString$"] %o "; } if (Victim.bIsFemale && default.FemaleSuicides.Length < 1) return default.FemaleSuicide; if (default.MaleSuicides.Length < 1) return default.MaleSuicide; if (Victim.bIsFemale) return default.FemaleSuicides[Rand(default.FemaleSuicides.Length)]; return default.MaleSuicides[Rand(default.MaleSuicides.Length)]; }
// Is keyword in description: Keep the commas in the keyword! e.g. ,Fire, ,Gas, ,Bullet, static function bool IsDamage(string TypeString) { return InStr(default.DamageDescription, TypeString) >= 0; }
// Call this to do damage to something. This lets the damagetype modify the things if it needs to static function Hurt (Actor Victim, float Damage, Pawn Instigator, vector HitLocation, vector Momentum, class<DamageType> DT) { Victim.TakeDamage(Damage, Instigator, HitLocation, Momentum, DT); } // Compatability for Hurt(), Call this with the DamageType if it might not be a BallisticDamageType // Use like this: class'BallisticDamageType'.static.GenericHurt (..., QuestionableDamagetype); static function GenericHurt (Actor Victim, float Damage, Pawn Instigator, vector HitLocation, vector Momentum, class<DamageType> DT) { if (class<BallisticDamageType>(DT) != None) class<BallisticDamageType>(DT).static.Hurt (Victim, Damage, Instigator, HitLocation, Momentum, DT); else Victim.TakeDamage(Damage, Instigator, HitLocation, Momentum, DT); }
// Spawn some blood effects static function DoBloodEffects( vector HitLocation, float Damage, vector Momentum, Pawn Victim, bool bLowDetail ) { if (Monster(Victim) == None && !Victim.PhysicsVolume.bWaterVolume && !default.bCantLoadBlood && GetBloodManager() != None) GetBloodManager().static.StartSpawnBlood(HitLocation + Normal(momentum)*Victim.CollisionRadius*1.5, Momentum, Victim); } // Spawn some blood effects static function class<BloodManager> GetBloodManager () { if (default.BloodManager == None) { default.BloodManager = class<BloodManager>(DynamicLoadObject(default.BloodManagerName,class'class',true)); if (default.BloodManager == None) default.bCantLoadBlood = true; } return default.BloodManager; }
// Plays a sound when this damage is done to pawns // This is a hook for damage specific blood effects static function class<Effects> GetPawnDamageEffect( vector HitLocation, float Damage, vector Momentum, Pawn Victim, bool bLowDetail ) { if (xPawn(Victim) != None) { if (default.PawnDamageSounds.Length > 0) Victim.PlaySound(default.PawnDamageSounds[Rand(default.PawnDamageSounds.Length)],,default.TransientSoundVolume,,default.TransientSoundRadius); if (default.EffectChance > 0 && default.EffectChance > FRand()) DoBloodEffects(HitLocation, Damage, Momentum, Victim, bLowDetail); if (Damage >= default.FlashThreshold) { if (PlayerController(Victim.Controller) != None) PlayerController(Victim.Controller).ClientFlash(default.FlashF, default.FlashV); } } return super.GetPawnDamageEffect(HitLocation, Damage, Momentum, Victim, bLowDetail); }
// Apply motion blur static function LocalHitEffects (Pawn Victim, name HitBone, vector HitLocation, vector HitRay, int Damage) { local float ScaleFactor;
// Pawn gives damage type a chance to modify hit properties. Called from PlayHit, so changes affect only effects, TakeDamage will be done already. static function ModifyHit (Pawn Victim, out float Damage, vector Momentum, out vector HitLocation, out vector HitRay, out name HitBone);
// Return true to decide a sever from here instead of using pawn's default code. Set bCanSever to desired result. static function bool OverrideCanSever(Pawn Pawn, name Bone, int Damage, vector HitLoc, vector HitRay, bool bDirectHit, out byte bCanSever);
// Spawn some blood effects static function bool DoBloodHit (Pawn Victim, name Bone, vector HitLoc, vector HitRay, int Damage) { if (default.bCantLoadBlood || GetBloodManager() == None) return false; GetBloodManager().static.DoBloodHit(Victim, Bone, HitLoc, HitRay, Damage); return true; } // Spawn sever effects static function bool DoSeverEffect (Pawn Victim, name Bone, vector HitRay, int Damage) { if (default.bCantLoadBlood || GetBloodManager() == None) return false; GetBloodManager().static.DoSeverEffects(Victim, Bone, HitRay, default.GibPerterbation, Damage); return true; } // Spawn sever stump static function bool DoSeverStump (Pawn Victim, name Bone, vector HitRay, int Damage) { if (default.bCantLoadBlood || GetBloodManager() == None) return false; if (default.bNoSeverStumps) return true; GetBloodManager().static.DoSeverStump(Victim, Bone, HitRay, Damage); return true; }
Ноуп, в TakeDamage просто проверяем какой DamageType получили, и если он совпадает с DamageTyp-ом рикошэтящего снаряда то спавним эффект рикошета. DamageType никогда не спавнитса, стандартный по крайней мере. Только, увы, если у танков нет общего супркласа (в смысле твоего, который можно без последствий перекомпилировать) то прийдетса это в каждом танке прописывать.
Ну сейчас рикошетит от всего кроме танков, правильно? Когда попадает в танк, независимо куда, должен запуститса TakeDamage, даже если если Damage = 0. Так вот в том месте где в TakeDamage онимаетса чего-то от Health, вот там и смотрим, если то что отнимаетса 0 или меньше какогото значения, то спавнитса эффект.
Мне бы цепочку по extends начиная от твоего конечного класа (одного из?) вехикла до первого стандартного, onsvehicle наверно. Не надо все танки, разве что у них extends разные.