[ POMOC] Skrypt taczającej się butelki

Uczymy się edytowania P2 i rozwiązujemy nasze problemy. Nowi adepci mile widziani!

Moderatorzy: Moderatorzy, Admini

Awatar użytkownika
Rycho3D
Modder
Modder
Posty: 11978
Rejestracja: 24 kwie 2011, 15:47
Lokalizacja: SinCity
Postawił piwo: 8 razy
Otrzymał  piwo: 1 raz
Kontakt:

17 sty 2012, 19:53

Wie ktoś dlaczego, nie działa ParticleColor? A dokładniej "function FitTheEffect"
Partycje szkieł są białe a powinny być brązowe.
Kod:

Kod: Zaznacz cały

///////////////////////////////////////////////////////////////////////////////
// Butelka
// Rycho3D
///////////////////////////////////////////////////////////////////////////////

class Butelka extends KActor;

var (RRendering) bool DynamicShadow;
var (RRendering) bool SingleGame;
var (RRendering) vector LightDirection;
var (RRendering) float  LightDistance;
var (RRendering) float MaxTraceDistance;
var RShadow MyShadow;

var ()float DamageThreshold;		// How much damage in a single shot you have to
									// do in order to break the prop
var ()float Health;					// How much health we have. At 0, we break
var &#40;&#41;class<P2Emitter> BreakEffectClass;	// Effect generated when you break the prop
var &#40;&#41;StaticMesh BrokenStaticMesh;	// Mesh subbed assigned to StaticMesh when the 
									// prop is broken
var &#40;&#41;bool bFitEffectToProp;		// Whether or not to attempt to make the effect
									// rotate to fit the prop.
var&#40;&#41; sound BreakingSound;			// Sound played when it breaks

var&#40;&#41; class<DamageType> DamageFilter;// Damage type we're concerned about.
									// To allow all damage types, have this be none &#40;default&#41;
var&#40;&#41; bool bBlockFilter;			// true means you'll accept all damages except DamageFilter
									// false means you'll only accept DamageFilter.&#40;default is false&#41;
var&#40;&#41; bool bTriggerControlled;		// Triggers are the only things that allow these kactors to explode, if true

var&#40;&#41; class<TimedMarker>DangerMarker;// Danger notifier &#40;if any&#41; this makes when broken
var &#40;&#41;float BreakPct;	// Percentage of max speed for an object to break the window
var&#40;&#41; color ParticleColor;

const MOMENTUM_RATIO = 0.02;
const MOM_MAX	=	20000;
///////////////////////////////////////////////////////////////////////////////
// Set it to dead, trigger sounds and all, and blow it up, setting off the physics
///////////////////////////////////////////////////////////////////////////////
function BlowThisUp&#40;int Damage, vector HitLocation, vector Momentum&#41;
&#123;
	local P2Emitter p2e;

	// Say we're broken so we won't break anymore
	GotoState&#40;'Broken'&#41;;

	// set to dead
	Health=0;

	// Spawn effect so we don't have to record the hit values and 
	// do it later in Broken beginstate or something. It's just
	// more efficient here
	p2e = spawn&#40;BreakEffectClass, self,,Location&#41;;
	if&#40;bFitEffectToProp&#41;
		FitTheEffect&#40;p2e, damage, HitLocation, momentum&#41;;

	// Play the breaking sound &#40;code copied from mover&#41;
	PlaySound&#40; BreakingSound, SLOT_None, SoundVolume / 255.0, false, SoundRadius, 0.96 + FRand&#40;&#41;*0.8&#41;;
&#125;

///////////////////////////////////////////////////////////////////////////////
// Orient the breaking effect and size it
///////////////////////////////////////////////////////////////////////////////
function FitTheEffect&#40;P2Emitter pse, int damage, vector HitLocation, vector HitMomentum&#41;
&#123;
	local float xsize, xradsize, yradsize, zradsize;
	local vector vecrot;
	local float totalarea, startarea;
	local float usedot;
	local float velmag;
	local int i;
	local int newmax;

	// Cap the momentum, so explosions and such don't send them so absurdly far
//	if&#40;VSize&#40;HitMomentum&#41; < MOM_MAX&#41;
//		HitMomentum = MOM_MAX*Normal&#40;HitMomentum&#41;;

	pse.Emitters&#91;0&#93;.StartLocationRange.X.Max =  CollisionRadius;
	pse.Emitters&#91;0&#93;.StartLocationRange.X.Min = -CollisionRadius;
	pse.Emitters&#91;0&#93;.StartLocationRange.Y.Max =  CollisionRadius;
	pse.Emitters&#91;0&#93;.StartLocationRange.Y.Min = -CollisionRadius;
	pse.Emitters&#91;0&#93;.StartLocationRange.Z.Max =  CollisionHeight;
	pse.Emitters&#91;0&#93;.StartLocationRange.Z.Min = -CollisionHeight;

	// Use this as your speed from the emitter, but also throw in some
	// of the damage.
	pse.Emitters&#91;0&#93;.StartVelocityRange.X.Max=MOMENTUM_RATIO*HitMomentum.x + pse.Emitters&#91;0&#93;.StartVelocityRange.X.Max;
	pse.Emitters&#91;0&#93;.StartVelocityRange.X.Min=-pse.Emitters&#91;0&#93;.StartVelocityRange.X.Max/8;
	pse.Emitters&#91;0&#93;.StartVelocityRange.Y.Max=MOMENTUM_RATIO*HitMomentum.y;
	pse.Emitters&#91;0&#93;.StartVelocityRange.Y.Min=-pse.Emitters&#91;0&#93;.StartVelocityRange.Y.Max/8;
	pse.Emitters&#91;0&#93;.StartVelocityRange.Z.Max=MOMENTUM_RATIO*HitMomentum.z;
	pse.Emitters&#91;0&#93;.StartVelocityRange.Z.Min=-pse.Emitters&#91;0&#93;.StartVelocityRange.Z.Max/8;

	// Color the emitters
	for&#40;i=0; i<pse.Emitters.Length; i++&#41;
	&#123;
		pse.Emitters&#91;i&#93;.ColorScale&#91;0&#93;.Color = ParticleColor;
		pse.Emitters&#91;i&#93;.ColorScale&#91;0&#93;.RelativeTime = 0.0;

		pse.Emitters&#91;i&#93;.ColorScale&#91;1&#93;.Color = ParticleColor;
		pse.Emitters&#91;i&#93;.ColorScale&#91;1&#93;.RelativeTime = 1.0;
	&#125;
&#125;

///////////////////////////////////////////////////////////////////////////////
Simulated Function PostBeginPlay&#40;&#41;
&#123;
  If&#40;DynamicShadow&#41;
   &#123;
   MyShadow = Spawn&#40;class'R3DFX.RShadow',Self,'',Location&#41;;
   MyShadow.ShadowActor = self;
   MyShadow.SetCollision&#40;true, false, false&#41;;
   MyShadow.LightDirection = Normal&#40;vect&#40;1,1,6&#41;&#41;;
   MyShadow.LightDistance = 512;
   MyShadow.MaxTraceDistance = 256;
   MyShadow.UpdateShadow&#40;&#41;;
  &#125;
&#125;

///////////////////////////////////////////////////////////////////////////////
// If DamageFilter is set, 
// and bBlockFilter is false only allow this damage
// else don't allow only this damage
///////////////////////////////////////////////////////////////////////////////
function bool AcceptThisDamage&#40;class<DamageType> damageType&#41;
&#123;
	if&#40;bTriggerControlled&#41;
		return false;

	if&#40;DamageFilter != None&#41;
	&#123;
		// accept only filter
		if&#40;!bBlockFilter&#41;
		&#123;
			if&#40;!ClassIsChildOf&#40;DamageFilter, damageType&#41;&#41;
				return false;
		&#125;
		else	// block the filter type
		&#123;
			if&#40;ClassIsChildOf&#40;DamageFilter, damageType&#41;&#41;
				return false;
		&#125;
	&#125;

	return true;
&#125;

///////////////////////////////////////////////////////////////////////////////
// If strong enough, it breaks the prop
///////////////////////////////////////////////////////////////////////////////
function TakeDamage&#40;int Damage, Pawn instigatedBy, Vector hitlocation, 
						Vector momentum, class<DamageType> damageType&#41;
&#123;
	local TimedMarker ADanger;

	// Check first if we take this damage
	if&#40;!AcceptThisDamage&#40;damageType&#41;&#41;
		return;

	// If so, check to make panic noises for people around us.
	// Only panic, if the damage before us *didn't* make some kind of
	// panic noise &#40;like a bullet hitting this would, and so would an
	// explosion&#41;
	if&#40;DangerMarker != None
		&& &#40;ClassIsChildOf&#40;damageType, class'CuttingDamage'&#41;
			|| ClassIsChildOf&#40;damageType, class'BludgeonDamage'&#41;&#41;&#41;
	&#123;
		ADanger = spawn&#40;DangerMarker,,,HitLocation&#41;;
		ADanger.CreatorPawn = FPSPawn&#40;InstigatedBy&#41;;
		ADanger.OriginActor = self;
		// This will cause people to see if they noticed and decide what to do
		ADanger.NotifyAndDie&#40;&#41;;
	&#125;

	// Only remove health if the singular damage was strong enough
	if&#40;damage > DamageThreshold&#41;
	&#123;
		Health -= damage;
		// if you run out of health, break
		if&#40;Health <= 0&#41;
		&#123;
			BlowThisUp&#40;Damage, HitLocation, Momentum&#41;;
		&#125;
	&#125;
&#125;

///////////////////////////////////////////////////////////////////////////////
// Broken
///////////////////////////////////////////////////////////////////////////////
state Broken
&#123;
	ignores TakeDamage;

	///////////////////////////////////////////////////////////////////////////////
	// You've just been freshly broken, generate effects
	///////////////////////////////////////////////////////////////////////////////
	function BeginState&#40;&#41;
	&#123;
		// Swap the mesh to the broken mesh if you have one
		if&#40;BrokenStaticMesh != None&#41;
		&#123;
			SetDrawType&#40;DT_StaticMesh&#41;;
			SetStaticMesh&#40;BrokenStaticMesh&#41;;
		&#125;
		else	// If we don't have a broken mesh, they don't want to
				// see it anymore, so just destroy it
			Destroy&#40;&#41;;
	&#125;
&#125;

defaultproperties
&#123;
     ParticleColor=&#40;B=34,G=38,R=51&#41;
     BreakPct=0.700000
     SoundVolume=255
     BreakEffectClass=Class'FX.ShatterGlass'
     bPawnMovesMe=True
     Health=5.000000
     DynamicShadow=False
     BrokenStaticMesh=StaticMesh'HD4.bottle_perla_crash1'
     BreakingSound=Sound'MiscSounds.Glass.glassbreak'
     Mass=5.000000
     StaticMesh=StaticMesh'HD4.bottle_perla'
     CollisionRadius=8.000000
     CollisionHeight=20.000000
     bUpdateSimulatedPosition=True
     SoundRadius=255.000000
     Begin Object Class=KarmaParams Name=KarmaParams16
         KFriction=0.900000
         KMass=1.000000
         KStartEnabled=False
         Name="KarmaParams16"
     End Object
     KParams=KarmaParams'R3DFX.KarmaParams16'
&#125;
Nie liczę na falę odpowiedzi. :P Ale może jakaś podpowiedź ?
Jeśli nikt mi nie pomoże to rozwiąże to inaczej (nowy emiter)


8=======D
Awatar użytkownika
Lothar
Pierwsi PSI
Pierwsi PSI
Posty: 2570
Rejestracja: 30 kwie 2007, 15:10
Lokalizacja: Lublin

18 sty 2012, 04:37

Głowy nie daję, ale to chyba przez to, że FX.ShatterGlass ma domyślnie wyłączony UseColorScale i DrawStyle ustawiony na PTDS_AlphaBlend (zamiast na PTDS_AlphaModulate_MightNotFogCorrectly). Możesz pomęczyć się z obejściem, albo przerzucić się na FX.ShatterBottle - działa bez problemu i pozwala na zmiany kolorów 8-)


Nobody Expects The Spanish Inquisition! :biskup:
Awatar użytkownika
Rycho3D
Modder
Modder
Posty: 11978
Rejestracja: 24 kwie 2011, 15:47
Lokalizacja: SinCity
Postawił piwo: 8 razy
Otrzymał  piwo: 1 raz
Kontakt:

18 sty 2012, 06:56

Dzięki . Daje pomógł.
Wykorzystam ShatterBottle.


8=======D
ODPOWIEDZ