Jump to content

Force powers (SP)


Recommended Posts

Now that I've finished with my cores, I want to move onto light/dark powers, but have no idea how to actually make them work.

 

(EDIT): I will update this as I progress.

 

 

Deadly Sight (Solved):

 

void ForceDeadlySightInit( gentity_t *self )
{
trace_t tr;
vec3_t end, forward;
gentity_t *traceEnt;
 
if ( self->health <= 0 )
{
return;
}
if ( !self->s.number && cg.zoomMode )
{//can't force lightning when zoomed in
return;
}
 
AngleVectors( self->client->ps.viewangles, forward, NULL, NULL );
VectorNormalize( forward );
 
//FIXME: if lightning hits water, do water-only-flagged radius damage from that point
if ( self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] > FORCE_LEVEL_0 )
{//arc
vec3_t center, mins, maxs, dir, ent_org, size, v;
float radius = 800, dot, dist;
gentity_t *entityList[MAX_GENTITIES];
int e, numListedEntities, i;
 
VectorCopy( self->currentOrigin, center );
for ( i = 0 ; i < 3 ; i++ ) 
{
mins[i] = center[i] - radius;
maxs[i] = center[i] + radius;
}
numListedEntities = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES );
 
for ( e = 0 ; e < numListedEntities ; e++ ) 
{
traceEnt = entityList[e];
 
if ( !traceEnt )
continue;
if ( traceEnt == self )
continue;
if ( !traceEnt->inuse )
continue;
if ( !traceEnt->takedamage )
continue;
if ( traceEnt->health <= 0 )//no torturing corpses
continue;
if ( !traceEnt->client )
continue;
if (self->enemy != traceEnt//not my enemy
&& OnSameTeam(self, traceEnt))//on my team
continue;
//this is all to see if we need to start a saber attack, if it's in flight, this doesn't matter
// find the distance from the edge of the bounding box
for ( i = 0 ; i < 3 ; i++ ) 
{
if ( center[i] < traceEnt->absmin[i] ) 
{
v[i] = traceEnt->absmin[i] - center[i];
} else if ( center[i] > traceEnt->absmax[i] ) 
{
v[i] = center[i] - traceEnt->absmax[i];
} else 
{
v[i] = 0;
}
}
 
VectorSubtract( traceEnt->absmax, traceEnt->absmin, size );
VectorMA( traceEnt->absmin, 0.5, size, ent_org );
 
//see if they're in front of me
//must be within the forward cone
VectorSubtract( ent_org, center, dir );
VectorNormalize( dir );
if ( (dot = DotProduct( dir, forward )) < 0.5 )
continue;
 
//must be close enough
dist = VectorLength( v );
if ( dist >= radius ) 
{
continue;
}
 
//in PVS?
if ( !traceEnt->bmodel && !gi.inPVS( ent_org, self->client->renderInfo.eyePoint ) )
{//must be in PVS
continue;
}
 
//Now check and see if we can actually hit it
gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 );
if ( tr.fraction < 1.0f && tr.entityNum != traceEnt->s.number )
{//must have clear LOS
continue;
}
 
// ok, we are within the radius, add us to the incoming list
//FIXME: maybe add up the ents and do more damage the less ents there are
// as if we're spreading out the damage?
ForceDeadlySightDamage( self, traceEnt, dir, dist, dot, ent_org );
}
 
}
else
{//trace-line
int ignore = self->s.number;
int traces = 0;
vec3_t start;
 
VectorCopy( self->client->renderInfo.eyePoint, start );
VectorMA( self->client->renderInfo.eyePoint, 2048, forward, end );
traceEnt = &g_entities[tr.entityNum];
ForceDeadlySightDamage( self, traceEnt, forward, 0, 0, tr.endpos );
}
}
 
void ForceDeadlySightDamage( gentity_t *self, gentity_t *traceEnt, vec3_t dir, float dist, float dot, vec3_t impactPoint )
{
if( traceEnt->NPC && traceEnt->NPC->scriptFlags & SCF_NO_FORCE )
{
return;
}
 
if ( traceEnt && traceEnt->takedamage )
{
if ( !traceEnt->client || traceEnt->client->playerTeam != self->client->playerTeam || self->enemy == traceEnt || traceEnt->enemy == self )
{//an enemy or object
int dmg;
int dflags = (DAMAGE_NO_ARMOR|DAMAGE_NO_KNOCKBACK|DAMAGE_NO_HIT_LOC);
//FIXME: check for client using FP_ABSORB
if ( self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] == FORCE_LEVEL_1 )
{//more damage if closer and more in front
if ( dist > 100 )
{
dmg = 0;
}
if ( dot < 0.9f )
{
dmg = 0;
}
else
{
dmg = 1;
}
if (self->client->ps.forcePowersActive & (1 << FP_RAGE) )
{
dmg *= 2;
}
}
if ( self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] == FORCE_LEVEL_2 )
{//more damage if closer and more in front
if ( dist > 200 )
{
dmg = 0;
}
if ( dot < 0.7f )
{
dmg = 0;
}
else
{
dmg = 1;
}
if ( self->client->NPC_class == CLASS_REBORN
&& self->client->ps.weapon == WP_NONE )
{//Cultist: looks fancy, but does less damage
}
else
{
if ( dist < 100 )
{
dmg += 1;
}
if ( dot > 0.9f )
{
dmg += 1;
}
}
if (self->client->ps.forcePowersActive & (1 << FP_RAGE) )
{
dmg *= 2;
}
}
if ( self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] == FORCE_LEVEL_3 )
{//more damage if closer and more in front
if ( dist > 400 )
{
dmg = 0;
}
if ( dot < 0.5f )
{
dmg = 0;
}
else
{
dmg = 1;
}
if ( self->client->NPC_class == CLASS_REBORN
&& self->client->ps.weapon == WP_NONE )
{//Cultist: looks fancy, but does less damage
}
else
{
if ( dist < 200 )
{
dmg += 1;
if ( dist < 100 )
{
dmg += 1;
}
}
if ( dot > 0.7f )
{
dmg += 1;
if ( dot > 0.9f )
{
dmg += 1;
}
}
}
if (self->client->ps.forcePowersActive & (1 << FP_RAGE) )
{
dmg *= 2;
}
}
if ( self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] == FORCE_LEVEL_4 )
{//more damage if closer and more in front
if ( dist > 800 )
{
dmg = 0;
}
if ( dot < 0.3f )
{
dmg = 0;
}
else
{
dmg = 1;
}
if ( self->client->NPC_class == CLASS_REBORN
&& self->client->ps.weapon == WP_NONE )
{//Cultist: looks fancy, but does less damage
}
else
{
if ( dist < 400 )
{
dmg += 1;
if ( dist < 200 )
{
dmg += 1;
if ( dist < 100 )
{
dmg += 1;
}
}
}
if ( dot > 0.5f )
{
dmg += 1;
if ( dot > 0.7f )
{
dmg += 1;
if ( dot > 0.9f )
{
dmg += 1;
}
}
}
}
if (self->client->ps.forcePowersActive & (1 << FP_RAGE) )
{
dmg *= 2;
}
}
if ( self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] == FORCE_LEVEL_5 )
{//more damage if closer and more in front
if ( dist > 800 )
{
dmg = 0;
}
else
{
dmg = 2;
}
if ( self->client->NPC_class == CLASS_REBORN
&& self->client->ps.weapon == WP_NONE )
{//Cultist: looks fancy, but does less damage
}
else
{
if ( dist < 800 )
{
dmg += 1;
if ( dist < 400 )
{
dmg += 1;
if ( dist < 200 )
{
dmg += 1;
if ( dist < 100 )
{ 
dmg += 1;
}
}
}
}
if ( dot > 0.3f )
{
dmg += 1;
if ( dot > 0.5f )
{
dmg += 1;
if ( dot > 0.7f )
{
dmg += 1;
if ( dot > 0.9f )
{
dmg += 1;
}
}
}
}
}
if (self->client->ps.forcePowersActive & (1 << FP_RAGE) )
{
dmg *= 2;
}
}
else
{
dmg = Q_irand( 1, 3 );//*self->client->ps.forcePowerLevel[FP_DEADLYSIGHT];
}
 
if ( traceEnt->client 
&& traceEnt->health > 0 
&& traceEnt->NPC 
&& (traceEnt->NPC->aiFlags&NPCAI_BOSS_CHARACTER) )
{//Luke, Desann Tavion and Kyle can shield themselves from the attack
//FIXME: shield effect or something?
//FIXME: don't interrupt big anims with this!
Jedi_PlayDeflectSound( traceEnt );
dmg = 0;
}
else if ( traceEnt->s.weapon == WP_SABER )
{//saber can block lightning
if ( traceEnt->client //a client
&& !traceEnt->client->ps.saberInFlight//saber in hand
&& ( traceEnt->client->ps.saberMove == LS_READY || PM_SaberInParry( traceEnt->client->ps.saberMove ) || PM_SaberInReturn( traceEnt->client->ps.saberMove ) )//not attacking with saber
&& InFOV( self->currentOrigin, traceEnt->currentOrigin, traceEnt->client->ps.viewangles, 20, 35 ) //I'm in front of them
&& !PM_InKnockDown( &traceEnt->client->ps ) //they're not in a knockdown
&& !PM_SuperBreakLoseAnim( traceEnt->client->ps.torsoAnim )
&& !PM_SuperBreakWinAnim( traceEnt->client->ps.torsoAnim )
&& !PM_SaberInSpecialAttack( traceEnt->client->ps.torsoAnim )
&& !PM_InSpecialJump( traceEnt->client->ps.torsoAnim )
&& (!traceEnt->s.number||(traceEnt->NPC&&traceEnt->NPC->rank>=RANK_LT_COMM)) )//the player or a tough jedi/reborn
{
if ( Q_irand( 0, traceEnt->client->ps.forcePowerLevel[FP_SABER_DEFENSE]*3 ) > 0 )//more of a chance of defending if saber defense is high
{
dmg = 0;
}
if ( (traceEnt->client->ps.forcePowersActive&(1<<FP_ABSORB))
&& traceEnt->client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_2 )
{//no parry, just absorb
}
}
else if ( Q_irand( 0, 1 ) )
{//jedi less likely to be damaged
dmg = 0;
}
else
{
dmg = 1;
}
}
if ( traceEnt && traceEnt->client && traceEnt->client->ps.powerups[PW_GALAK_SHIELD] )
{
//has shield up
dmg = 0;
}
int modPowerLevel = -1;
 
if (traceEnt->client)
{
modPowerLevel = WP_AbsorbConversion(traceEnt, traceEnt->client->ps.forcePowerLevel[FP_ABSORB], self, FP_DEADLYSIGHT, self->client->ps.forcePowerLevel[FP_DEADLYSIGHT], 1);
}
 
if (modPowerLevel != -1)
{
if ( !modPowerLevel )
{
dmg = 0;
}
else if ( modPowerLevel == 1 )
{
dmg = floor((float)dmg/4.0f);
}
else if ( modPowerLevel == 2 )
{
dmg = floor((float)dmg/2.0f);
}
else if ( modPowerLevel == 3 )
{
dmg = floor((float)dmg/1.0f);
}
else if ( modPowerLevel == 4 )
{
dmg = floor((float)dmg/0.5f);
}
else if ( modPowerLevel == 5 )
{
dmg = floor((float)dmg/0.25f);
}
else if ( modPowerLevel > 5 )
{
dmg = floor((float)dmg/0.12f);
}
}
//FIXME: if ForceDrain, sap force power and add health to self, use different sound & effects
if ( dmg )
{
G_Damage( traceEnt, self, self, dir, impactPoint, dmg, dflags, MOD_FORCE_DEADLYSIGHT );
}
}
}
}
 
void ForceDeadlySight( gentity_t *self )
{
if ( self->health <= 0 )
{
return;
}
 
if (self->client->ps.forceAllowDeactivateTime < level.time &&
(self->client->ps.forcePowersActive & (1 << FP_DEADLYSIGHT)) )
{
WP_ForcePowerStop( self, FP_DEADLYSIGHT );
return;
}
 
if ( !WP_ForcePowerUsable( self, FP_DEADLYSIGHT, 0 ) )
{
return;
}
 
if (self->client->ps.forcePowersActive & (1 << FP_PROTECT) )
{
WP_ForcePowerStop( self, FP_PROTECT );
}
 
if (self->client->ps.forcePowersActive & (1 << FP_ABSORB) )
{
WP_ForcePowerStop( self, FP_ABSORB );
}
 
if (self->client->ps.forcePowersActive & (1 << FP_SEE) )
{
WP_ForcePowerStop( self, FP_SEE );
}
 
if ( self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] < FORCE_LEVEL_3 )//optional
{
forcePowerNeeded[FP_DEADLYSIGHT] = 50;
}
 
if ( self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] >= FORCE_LEVEL_3 ] )//optional
{
forcePowerNeeded[FP_DEADLYSIGHT] = 25;
}
 
WP_DebounceForceDeactivateTime( self );
 
WP_ForcePowerStart( self, FP_DEADLYSIGHT, 0 );
 
G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/dsight.wav" );
}</code>
 
Under void WP_ForcePowerStart( gentity_t *self, forcePowers_t forcePower, int overrideAmt ):
<code>case FP_DEADLYSIGHT:
switch ( self->client->ps.forcePowerLevel[FP_DEADLYSIGHT] )
{
case FORCE_LEVEL_5:
duration = 25000;
break;
case FORCE_LEVEL_4:
duration = 20000;
break;
case FORCE_LEVEL_3:
duration = 15000;
break;
case FORCE_LEVEL_2:
duration = 10000;
break;
case FORCE_LEVEL_1:
default:
 
duration = 5000;
break;
}
self->client->ps.forcePowersActive |= ( 1 << forcePower );
G_SoundOnEnt( self, CHAN_ITEM, "sound/weapons/force/dsight.wav" );
self->s.loopSound = G_SoundIndex( "sound/weapons/force/dsightloop.wav" );
break;</code>
 
Under void WP_ForcePowerStop( gentity_t *self, forcePowers_t forcePower ):
<code>case FP_DEADLYSIGHT:
self->s.loopSound = 0;
break;
 
Under void WP_CheckForcedPowers( gentity_t *self, usercmd_t *ucmd ):
case FP_DEADLYSIGHT:
ForceDeadlySight( self );
break;
 
bg_pmove.cpp:
 
extern void ForceDeadlySight( gentity_t *self );
 
Under void PM_CheckForceUseButton( gentity_t *ent, usercmd_t *ucmd  ):
case FP_DEADLYSIGHT: 
ForceDeadlySight( ent );
break;
 
cg_main.cpp:
int showPowers[MAX_SHOWPOWERS] = 
{
FP_ABSORB,
FP_HEAL,
FP_PROTECT,
FP_TELEPATHY,
 
FP_SPEED,
FP_PUSH,
FP_PULL,
FP_SEE,
 
FP_DRAIN,
FP_LIGHTNING,
FP_RAGE,
FP_GRIP,
FP_DEADLYSIGHT,
};
 
const char *showPowersName[MAX_SHOWPOWERS] = 
{
"SP_INGAME_ABSORB2",
"SP_INGAME_HEAL2",
"SP_INGAME_PROTECT2",
"SP_INGAME_MINDTRICK2",
 
"SP_INGAME_SPEED2",
"SP_INGAME_PUSH2",
"SP_INGAME_PULL2",
"SP_INGAME_SEEING2",
 
"SP_INGAME_DRAIN2",
"SP_INGAME_LIGHTNING2",
"SP_INGAME_DARK_RAGE2",
"SP_INGAME_GRIP2",
"SP_INGAME_DEADLYSIGHT2",
};
 
// Keep these with groups light side, core, and dark side
int showDataPadPowers[MAX_DPSHOWPOWERS] = 
{
// Light side
FP_ABSORB,
FP_HEAL,
FP_PROTECT,
FP_TELEPATHY,
 
// Core Powers
FP_LEVITATION,
FP_SPEED,
FP_PUSH,
FP_PULL,
FP_SABERTHROW,
FP_SABER_DEFENSE,
FP_SABER_OFFENSE,
FP_SEE,
 
//Dark Side
FP_DRAIN,
FP_LIGHTNING,
FP_RAGE,
FP_GRIP,
FP_DEADLYSIGHT,
};
 
 
Under CG_Init( int serverCommandSequence ) {:
const char *force_icon_files[NUM_FORCE_POWERS] = 
{//icons matching enums forcePowers_t
"gfx/mp/f_icon_lt_heal", //FP_HEAL,
"gfx/mp/f_icon_levitation", //FP_LEVITATION,
"gfx/mp/f_icon_speed", //FP_SPEED,
"gfx/mp/f_icon_push", //FP_PUSH,
"gfx/mp/f_icon_pull", //FP_PULL,
"gfx/mp/f_icon_lt_telepathy", //FP_TELEPATHY,
"gfx/mp/f_icon_dk_grip", //FP_GRIP,
"gfx/mp/f_icon_dk_l1", //FP_LIGHTNING,
"gfx/mp/f_icon_saber_throw", //FP_SABERTHROW
"gfx/mp/f_icon_saber_defend", //FP_SABERDEFEND,
"gfx/mp/f_icon_saber_attack", //FP_SABERATTACK,
"gfx/mp/f_icon_dk_rage", //FP_RAGE,
"gfx/mp/f_icon_lt_protect", //FP_PROTECT,
"gfx/mp/f_icon_lt_absorb", //FP_ABSORB,
"gfx/mp/f_icon_dk_drain", //FP_DRAIN,
"gfx/mp/f_icon_sight", //FP_SEE,
"gfx/mp/f_icon_dk_dsight", //FP_DEADLYSIGHT,
};

 

q_shared.h:

 

 

typedef enum
{
FP_FIRST = 0,//marker
FP_HEAL = 0,//instant
FP_LEVITATION,//hold/duration
FP_SPEED,//duration
FP_PUSH,//hold/duration
FP_PULL,//hold/duration
FP_TELEPATHY,//instant
FP_GRIP,//hold/duration
FP_LIGHTNING,//hold/duration
FP_SABERTHROW,
FP_SABER_DEFENSE,
FP_SABER_OFFENSE,
//new Jedi Academy powers
FP_RAGE,//duration - speed, invincibility and extra damage for short period, drains your health and leaves you weak and slow afterwards.
FP_PROTECT,//duration - protect against physical/energy (level 1 stops blaster/energy bolts, level 2 stops projectiles, level 3 protects against explosions)
FP_ABSORB,//duration - protect against dark force powers (grip, lightning, drain - maybe push/pull, too?)
FP_DRAIN,//hold/duration - drain force power for health
FP_SEE,//duration - detect/see hidden enemies
FP_DEADLYSIGHT,
NUM_FORCE_POWERS
} forcePowers_t;

 

 

Destruction:

 

I have no idea whatsoever how to code this into SP.

 

 

Blind:

 

I want to use the code for Mind Trick, except make it to where it hits multiple people and doesn't deactivate when you attack someone.

 

 

Stasis:

 

Like Grip, except I want it to hit multiple enemies at level 3.

Link to comment
  • 2 weeks later...

I am very interessed about thats function for my mod about legacy of kain. but i think that coding new force power have a incredible potentiality for every mod or conversion :) really, JA has not much force powers. can have 32 powers, but game get only 16 powers.

:(

I need just a stasis power for incapacitate spell, also blind is interessing for the power of the dark reaver. (make player invisible to the enemies) If You have success with this work, can you contact me about or show me the solution? i am very interessed to learn how to make SP force powers. :)

WIt's a long work however: yu need also to configure the NPC command interface for allow Cheats for the power, specified the 1-3 level of rank of the power, and also, yu need to make the power usable in NPC file, so also NPC can have for attack the player.

need also to specify sound and efx for the new powers and also, the function "forcerestrict" of SAB files for the new powers and HUD icons and the power selectable on the HUD. O.o

for make really a good work, at end, need also to add the power in the cvars assets of ui menu for single player for learn the power or add rank into the course of the tier tasks of the game. It's not really easy, making a force power need a complete reconversion of game.  

Link to comment
  • 1 month later...

At the moment, I'm working on Destruction. Problem is, I have no idea at all how to translate "wp_concussion.cpp" into "wp_saber.cpp" . 

 

As of right now, the only time it "does" work, is when I click Mouse1 in a certain spot on the map, and npcs will indeed try to push it back, but it's like the Disruptor Rifle's firing function: Once you fire, there's no stopping it.

 

Even when it "explodes" on a surface, it never plays the missile's FX, or the explosion's FX either; It just damages whatever is within the blast radius of the spot I clicked on.

Link to comment

mmmm.... Why you work about concussion as saber exactly? What you want to do exactly?

If you make the Concussion functions like the saber functions... i think for customize efx yu need to think the concussion as a saber, so need a SAB file with "hitothereffect path\effect.efx" parameter and "BounceOnWalls 1" In that's mode maybe fire the EFX when impact on a surface. Yu can also decide the splasdamage, the splashradius, the splashknockback and the knockbackscale and damagescale value. SAB file too. ;)

 

Ehi, i can shoot a big stupid thing, now, eh? i am not again a coder. i am ending my custom saber efx at moment. I not know if my foolish idea can be of some help.

Link to comment

Using Force Destruction in Jedi Knight: Dark Forces 2 was like making a grenade out of thin air, and then throwing it. Also, the method you described would only affect objects that the Lightsaber touches when you attack, which would only be effective as a "Saber Sling" from The Force Unleashed.

Link to comment

Using Force Destruction in Jedi Knight: Dark Forces 2 was like making a grenade out of thin air, and then throwing it. Also, the method you described would only affect objects that the Lightsaber touches when you attack, which would only be effective as a "Saber Sling" from The Force Unleashed.

so it's a explosive grenade of Force. I have not played to DF2. :S Mmm, and if you make a force power that acts like WP_THERMAL or a new Weapon like WP_THERMAL with custom effects, models and sound with code edited for a one shot explosive without time count attack also for first shoot? (first attack like the second of thermal that explode on impact, without count of seconds)?

:)

Link to comment
  • 3 weeks later...

@@JediBantha i have a suggest for you about force stasis: simply make a new force power SP and set like the force grip level 1.

rank simply get more strong the power (example, some classes resist to grip... some classes can resist to the weak level of stasis) and with more duration :)

Remove the animation setting for players for make the BOTH_GRIPPED animation.

Merge the pm_freeze function. @@Serenity937 in his mode make some freezing grenade that block enemy moviment for 5 second. Yu can ask him how works that and report into the force code. ;)

Link to comment

Stasis would probably also require pieces of both the "ForceLightningShoot" and "ForceTelepathy" codes, (Lightning's radius damage,  and MindTrick's distract effect, where you only hit a floor/wall with Mind Trick) for a more coordinated use of the power's freeze effect at levels 3 and above.

 

As for Destruction... From what I gathered from switching labels around in it's missile code, I know that it has alot to do with the line "VectorCopy( muzzle, start );" .

The problem I have now is whether I should edit either "muzzle" or "start", or just add a specific label to make it actually fire straight at all times, and not mark a surface with Saber swings. 

Asgarath83 likes this
Link to comment

mmm, muzzleflash... not work on weapons.dat if yu add to your force destruction, right?

there a command in SAB files called "nowallmarks" if you set to 1 yu can see the customlightsaber not cut the walls or make the marks f burining wall. yu need to check the code that enable the "nowallmarks 1" command and report on the code of force destruction weapon.

 

Force stasis \ paralysis: Yes, mindtrick code  can allow you to specify the AI of stasis and stunning behavour, and a visual efx, like an aura (maybe as force rage) for the stasis power. Lightning code allow you to set the efx for shooting the stasis field :)

 

force Blind : simply use mindtrick level 1-2 code also for level 3 and 4, but use the forcelightning level 3 code about the affecting of multiple peolples :)

Link to comment

Oh... O_O. So it's converted into a "laser crosshair" saber", right? O.o

That's strange, but you have converted the WP_SABER in a shooting weapons. sure it's an unexpected consequence.

mmmm... in that case... if the saber\ weapon detruction enlight the wall that face...  yu need to check the code about the SAB file noDlight function, if it's setted on 1, saber not show the light on the walls. yu need to add that's part of code into the code of force destruction, IMHO. i am not much sure, i am not a coder, so i can give you only suggestion based of my modding experience about the weapons in single player.

:(

So not take as gold my words.

It's better if yu ask to an expert coder about that's issue. Very odd, however.

 

 

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...