JediBantha Posted January 9, 2014 Posted January 9, 2014 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.
Asgarath83 Posted January 18, 2014 Posted January 18, 2014 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.ofor 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.
JediBantha Posted March 3, 2014 Author Posted March 3, 2014 I'm having second thoughts about Stasis... Feel like I should put in Valor instead, but I dunno.
Asgarath83 Posted March 4, 2014 Posted March 4, 2014 WOW! Thanks very much for your sharing!!! I cannot wait for the stasis *_* i need too this power for a spell called "incapacitate"
Asgarath83 Posted March 9, 2014 Posted March 9, 2014 @@JediBantha . For Force Stasis maybe yu can ask to @@Serenity937. on his mod he make something like a freezing grenade. So He know how to make stasys. http://jkhub.org/topic/3450-changing-force-aura-fx-sense-protection-rage-etc/?hl=aura See that thread. Scrolling the discussion, yu can see something of interess about the coding of Freezing function. Maybe can helpyu a lot.
JediBantha Posted March 12, 2014 Author Posted March 12, 2014 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.
Asgarath83 Posted March 12, 2014 Posted March 12, 2014 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.
JediBantha Posted March 17, 2014 Author Posted March 17, 2014 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.
Asgarath83 Posted March 18, 2014 Posted March 18, 2014 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)?
Asgarath83 Posted April 7, 2014 Posted April 7, 2014 @@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.
JediBantha Posted April 10, 2014 Author Posted April 10, 2014 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
Asgarath83 Posted April 15, 2014 Posted April 15, 2014 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
JediBantha Posted April 16, 2014 Author Posted April 16, 2014 I may have mis-worded the description of my problem when I said 'marked' ...
Asgarath83 Posted April 17, 2014 Posted April 17, 2014 Oh... O_O. So it's converted into a "laser crosshair" saber", right? O.oThat'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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now