Jump to content

Home

Kaiburr Saga MOD! Its awsome!


Woodster2003

Recommended Posts

Go to this site and check this mod out! IT is awsome, they are going to make the animations correct for the double sided saber, and impliment duel sabers(2 sabers at once), more stances, new server options, new levels, new skins, new everything. Go check it out! They need:

 

Coder Must know C++, must have experience in editing Q3

 

Animator Must have some kind of animation program, experience in animating a plus

 

Modeller Must have a modelling program, must have experience modelling. Q3 experience a plus

 

Mapper Able to figure out how to make JK2 maps. Q3 experience a plus

 

Technical Consultant Helps out the team when they get stuck on random things. Advises other positions. Must have made a mod before - OR - Must have experience and 'know how' in the ways of putting all the parts of a Q3 mod together.

 

Management Supervises a section of the mod Must want to keep people motivated and on schedule. Must talk on forums and keep in touch with his section. This position is very important. Only apply if you are willing to go all the way.

 

If you have expierence with any of these things then go to the site, there is a application form on the site, no beta signups yet. Please go check out this mod, it will more than likely fix all the problems people are complaining about(saber problems). The web address is:

 

 

 

 

http://www.kaiburrsaga.com/

 

 

Cya on the Kaiburr Forums. :D

Link to comment
Share on other sites

  • 3 weeks later...

THe thing with the animation is that in order to such a thing, someone would need the very expensive SoftImage animation program, and by the time they bought JK2, they would all ready need to know the program inside out.. because from what i;ve been hearing, it is a VERY steep learning curve, its not like MIlkshape where people can get a knack for it (can't get a knack for anything except killing a jedi here and there)... but yea... I would love to see my anakin running around with 2 sabers in hand(s), slicing and dicing, and make minced meat of jedis and sith alike...

Link to comment
Share on other sites

Hate to break it to you, but THIS MOD WILL FLOP. Why? Because there are NO good coders and NO good animators.

 

Want to see what the saber code for MP is like? There is no SP code, so they can't even do that (it's hard coded). Here you go:

 

#include "g_local.h"

#include "bg_local.h" //Only because we use PM_SetAnim here once.

#include "w_saber.h"

#include "ai_main.h"

#include "..\ghoul2\g2.h"

 

#define SABER_BOX_SIZE 16.0f

 

extern bot_state_t *botstates[MAX_CLIENTS];

extern qboolean InFront( vec3_t spot, vec3_t from, vec3_t fromAngles, float threshHold );

 

int saberSpinSound = 0;

int saberOffSound = 0;

int saberOnSound = 0;

int saberHumSound = 0;

 

//would be cleaner if these were renamed to BG_ and proto'd in a header.

qboolean PM_SaberInTransition( int move );

qboolean PM_SaberInDeflect( int move );

qboolean PM_SaberInBrokenParry( int move );

qboolean PM_SaberInBounce( int move );

 

float RandFloat(float min, float max) {

return ((rand() * (max - min)) / 32768.0F) + min;

}

 

//#define DEBUG_SABER_BOX

 

#ifdef DEBUG_SABER_BOX

void G_DebugBoxLines(vec3_t mins, vec3_t maxs, int duration)

{

vec3_t start;

vec3_t end;

 

float x = maxs[0] - mins[0];

float y = maxs[1] - mins[1];

 

// top of box

VectorCopy(maxs, start);

VectorCopy(maxs, end);

start[0] -= x;

G_TestLine(start, end, 0x00000ff, duration);

end[0] = start[0];

end[1] -= y;

G_TestLine(start, end, 0x00000ff, duration);

start[1] = end[1];

start[0] += x;

G_TestLine(start, end, 0x00000ff, duration);

G_TestLine(start, maxs, 0x00000ff, duration);

// bottom of box

VectorCopy(mins, start);

VectorCopy(mins, end);

start[0] += x;

G_TestLine(start, end, 0x00000ff, duration);

end[0] = start[0];

end[1] += y;

G_TestLine(start, end, 0x00000ff, duration);

start[1] = end[1];

start[0] -= x;

G_TestLine(start, end, 0x00000ff, duration);

G_TestLine(start, mins, 0x00000ff, duration);

}

#endif

 

#define PROPER_THROWN_VALUE 999 //Ah, well..

 

void SaberUpdateSelf(gentity_t *ent)

{

if (ent->r.ownerNum == ENTITYNUM_NONE)

{

ent->think = G_FreeEntity;

ent->nextthink = level.time;

return;

}

 

if (!g_entities[ent->r.ownerNum].inuse ||

!g_entities[ent->r.ownerNum].client ||

g_entities[ent->r.ownerNum].client->sess.sessionTeam == TEAM_SPECTATOR)

{

ent->think = G_FreeEntity;

ent->nextthink = level.time;

return;

}

 

if (g_entities[ent->r.ownerNum].client->ps.saberInFlight && g_entities[ent->r.ownerNum].health > 0)

{ //let The Master take care of us now (we'll get treated like a missile until we return)

ent->nextthink = level.time;

ent->bolt_Head = PROPER_THROWN_VALUE;

return;

}

 

ent->bolt_Head = 0;

 

if (g_entities[ent->r.ownerNum].client->ps.usingATST)

{ //using atst

ent->r.contents = 0;

ent->clipmask = 0;

}

else if (g_entities[ent->r.ownerNum].client->ps.weapon != WP_SABER ||

(g_entities[ent->r.ownerNum].client->ps.pm_flags & PMF_FOLLOW) ||

g_entities[ent->r.ownerNum].health < 1 ||

g_entities[ent->r.ownerNum].client->ps.saberHolstered ||

!g_entities[ent->r.ownerNum].client->ps.fd.forcePowerLevel[FP_SABERATTACK])

{ //owner is not using saber, spectating, dead, saber holstered, or has no attack level

ent->r.contents = 0;

ent->clipmask = 0;

}

else

{ //Standard contents (saber is active)

#ifdef DEBUG_SABER_BOX

vec3_t dbgMins;

vec3_t dbgMaxs;

 

if (ent->r.ownerNum == 0)

{

VectorAdd( ent->r.currentOrigin, ent->r.mins, dbgMins );

VectorAdd( ent->r.currentOrigin, ent->r.maxs, dbgMaxs );

 

G_DebugBoxLines(dbgMins, dbgMaxs, 100);

}

#endif

 

ent->r.contents = CONTENTS_LIGHTSABER;

ent->clipmask = MASK_PLAYERSOLID | CONTENTS_LIGHTSABER;

}

 

trap_LinkEntity(ent);

 

ent->nextthink = level.time;

}

 

void SaberGotHit( gentity_t *self, gentity_t *other, trace_t *trace )

{

gentity_t *own = &g_entities[self->r.ownerNum];

 

if (!own || !own->client)

{

return;

}

 

//Do something here..? Was handling projectiles here, but instead they're now handled in their own functions.

}

 

void WP_SaberInitBladeData( gentity_t *ent )

{

gentity_t *saberent;

 

//We do not want the client to have any real knowledge of the entity whatsoever. It will only

//ever be used on the server.

saberent = G_Spawn();

ent->client->ps.saberEntityNum = saberent->s.number;

saberent->classname = "lightsaber";

 

saberent->r.svFlags = SVF_USE_CURRENT_ORIGIN;

saberent->r.ownerNum = ent->s.number;

 

saberent->clipmask = MASK_PLAYERSOLID | CONTENTS_LIGHTSABER;

saberent->r.contents = CONTENTS_LIGHTSABER;

 

VectorSet( saberent->r.mins, -SABER_BOX_SIZE, -SABER_BOX_SIZE, -SABER_BOX_SIZE );

VectorSet( saberent->r.maxs, SABER_BOX_SIZE, SABER_BOX_SIZE, SABER_BOX_SIZE );

 

saberent->mass = 10;

 

saberent->s.eFlags |= EF_NODRAW;

saberent->r.svFlags |= SVF_NOCLIENT;

 

saberent->touch = SaberGotHit;

 

saberent->think = SaberUpdateSelf;

saberent->bolt_Head = 0;

saberent->nextthink = level.time + 50;

 

saberSpinSound = G_SoundIndex("sound/weapons/saber/saberspin.wav");

saberOffSound = G_SoundIndex("sound/weapons/saber/saberoffquick.wav");

saberOnSound = G_SoundIndex("sound/weapons/saber/saberon.wav");

saberHumSound = G_SoundIndex("sound/weapons/saber/saberhum1.wav");

}

 

//NOTE: If C` is modified this function should be modified as well (and vice versa)

void G_G2ClientSpineAngles( gentity_t *ent, vec3_t viewAngles, const vec3_t angles, vec3_t thoracicAngles, vec3_t ulAngles, vec3_t llAngles )

{

viewAngles[YAW] = AngleDelta( ent->client->ps.viewangles[YAW], angles[YAW] );

 

if ( !BG_FlippingAnim( ent->client->ps.legsAnim )

&& !BG_SpinningSaberAnim( ent->client->ps.legsAnim )

&& !BG_SpinningSaberAnim( ent->client->ps.torsoAnim )

&& ent->client->ps.legsAnim != ent->client->ps.torsoAnim )//NOTE: presumes your legs & torso are on the same frame, though they *should* be because PM_SetAnimFinal tries to keep them in synch

{//FIXME: no need to do this if legs and torso on are same frame

//adjust for motion offset

mdxaBone_t boltMatrix;

vec3_t motionFwd, motionAngles;

vec3_t motionRt, tempAng;

int ang;

 

trap_G2API_GetBoltMatrix_NoRecNoRot( ent->client->ghoul2, 0, ent->bolt_Motion, &boltMatrix, vec3_origin, ent->client->ps.origin, level.time, /*cgs.gameModels*/0, vec3_origin);

//trap_G2API_GiveMeVectorFromMatrix( &boltMatrix, NEGATIVE_Y, motionFwd );

motionFwd[0] = -boltMatrix.matrix[0][1];

motionFwd[1] = -boltMatrix.matrix[1][1];

motionFwd[2] = -boltMatrix.matrix[2][1];

 

vectoangles( motionFwd, motionAngles );

 

//trap_G2API_GiveMeVectorFromMatrix( &boltMatrix, NEGATIVE_X, motionRt );

motionRt[0] = -boltMatrix.matrix[0][0];

motionRt[1] = -boltMatrix.matrix[1][0];

motionRt[2] = -boltMatrix.matrix[2][0];

vectoangles( motionRt, tempAng );

motionAngles[ROLL] = -tempAng[PITCH];

 

for ( ang = 0; ang < 3; ang++ )

{

viewAngles[ang] = AngleNormalize180( viewAngles[ang] - AngleNormalize180( motionAngles[ang] ) );

}

}

//distribute the angles differently up the spine

//NOTE: each of these distributions must add up to 1.0f

thoracicAngles[PITCH] = viewAngles[PITCH]*0.20f;

llAngles[PITCH] = viewAngles[PITCH]*0.40f;

ulAngles[PITCH] = viewAngles[PITCH]*0.40f;

 

thoracicAngles[YAW] = viewAngles[YAW]*0.20f;

ulAngles[YAW] = viewAngles[YAW]*0.35f;

llAngles[YAW] = viewAngles[YAW]*0.45f;

 

thoracicAngles[ROLL] = viewAngles[ROLL]*0.20f;

ulAngles[ROLL] = viewAngles[ROLL]*0.35f;

llAngles[ROLL] = viewAngles[ROLL]*0.45f;

}

 

void G_G2PlayerAngles( gentity_t *ent, vec3_t legs[3], vec3_t legsAngles){

vec3_t torsoAngles, headAngles;

float dest;

static int movementOffsets[8] = { 0, 22, 45, -22, 0, 22, -45, -22 };

vec3_t velocity;

float speed;

int dir;

vec3_t velPos, velAng;

int adddir = 0;

float dif;

float degrees_negative = 0;

float degrees_positive = 0;

qboolean yawing = qfalse;

vec3_t ulAngles, llAngles, viewAngles, angles, thoracicAngles = {0,0,0};

 

VectorCopy( ent->client->ps.viewangles, headAngles );

headAngles[YAW] = AngleMod( headAngles[YAW] );

VectorClear( legsAngles );

VectorClear( torsoAngles );

 

// --------- yaw -------------

 

// allow yaw to drift a bit

if ((( ent->s.legsAnim & ~ANIM_TOGGLEBIT ) != BOTH_STAND1) ||

( ent->s.torsoAnim & ~ANIM_TOGGLEBIT ) != WeaponReadyAnim[ent->s.weapon] )

{

yawing = qtrue;

}

 

// adjust legs for movement dir

dir = ent->s.angles2[YAW];

if ( dir < 0 || dir > 7 ) {

return;

}

 

torsoAngles[YAW] = headAngles[YAW] + 0.25 * movementOffsets[ dir ];

 

// --------- pitch -------------

 

// only show a fraction of the pitch angle in the torso

if ( headAngles[PITCH] > 180 ) {

dest = (-360 + headAngles[PITCH]) * 0.75;

} else {

dest = headAngles[PITCH] * 0.75;

}

 

torsoAngles[PITCH] = ent->client->ps.viewangles[PITCH];

 

// --------- roll -------------

 

 

// lean towards the direction of travel

VectorCopy( ent->s.pos.trDelta, velocity );

speed = VectorNormalize( velocity );

 

if ( speed ) {

vec3_t axis[3];

float side;

 

speed *= 0.05;

 

AnglesToAxis( legsAngles, axis );

side = speed * DotProduct( velocity, axis[1] );

legsAngles[ROLL] -= side;

 

side = speed * DotProduct( velocity, axis[0] );

legsAngles[PITCH] += side;

}

 

//rww - crazy velocity-based leg angle calculation

legsAngles[YAW] = headAngles[YAW];

velPos[0] = ent->client->ps.origin[0] + velocity[0];

velPos[1] = ent->client->ps.origin[1] + velocity[1];

velPos[2] = ent->client->ps.origin[2] + velocity[2];

 

if (ent->client->ps.groundEntityNum == ENTITYNUM_NONE)

{ //off the ground, no direction-based leg angles

VectorCopy(ent->client->ps.origin, velPos);

}

 

VectorSubtract(ent->client->ps.origin, velPos, velAng);

 

if (!VectorCompare(velAng, vec3_origin))

{

vectoangles(velAng, velAng);

 

if (velAng[YAW] <= legsAngles[YAW])

{

degrees_negative = (legsAngles[YAW] - velAng[YAW]);

degrees_positive = (360 - legsAngles[YAW]) + velAng[YAW];

}

else

{

degrees_negative = legsAngles[YAW] + (360 - velAng[YAW]);

degrees_positive = (velAng[YAW] - legsAngles[YAW]);

}

 

if (degrees_negative < degrees_positive)

{

dif = degrees_negative;

adddir = 0;

}

else

{

dif = degrees_positive;

adddir = 1;

}

 

if (dif > 90)

{

dif = (180 - dif);

}

 

if (dif > 60)

{

dif = 60;

}

 

//Slight hack for when playing is running backward

if (dir == 3 || dir == 5)

{

dif = -dif;

}

 

if (adddir)

{

legsAngles[YAW] -= dif;

}

else

{

legsAngles[YAW] += dif;

}

}

 

legsAngles[YAW] = ent->client->ps.viewangles[YAW];

 

legsAngles[ROLL] = 0;

torsoAngles[ROLL] = 0;

 

// pull the angles back out of the hierarchial chain

AnglesSubtract( headAngles, torsoAngles, headAngles );

AnglesSubtract( torsoAngles, legsAngles, torsoAngles );

AnglesToAxis( legsAngles, legs );

// we assume that model 0 is the player model.

 

VectorCopy( ent->client->ps.viewangles, viewAngles );

 

if (viewAngles[PITCH] > 290)

{ //keep the same general range as lerpAngles on the client so we can use the same spine correction

viewAngles[PITCH] -= 360;

}

 

viewAngles[YAW] = viewAngles[ROLL] = 0;

viewAngles[PITCH] *= 0.5;

 

VectorCopy(legsAngles, angles);

 

G_G2ClientSpineAngles(ent, viewAngles, angles, thoracicAngles, ulAngles, llAngles);

 

trap_G2API_SetBoneAngles(ent->client->ghoul2, 0, "upper_lumbar", ulAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, level.time);

trap_G2API_SetBoneAngles(ent->client->ghoul2, 0, "lower_lumbar", llAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, level.time);

trap_G2API_SetBoneAngles(ent->client->ghoul2, 0, "thoracic", thoracicAngles, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, level.time);

}

 

qboolean SaberAttacking(gentity_t *self)

{

if (PM_SaberInParry(self->client->ps.saberMove))

{

return qfalse;

}

if (PM_SaberInBrokenParry(self->client->ps.saberMove))

{

return qfalse;

}

if (PM_SaberInDeflect(self->client->ps.saberMove))

{

return qfalse;

}

if (PM_SaberInBounce(self->client->ps.saberMove))

{

return qfalse;

}

if (PM_SaberInKnockaway(self->client->ps.saberMove))

{

return qfalse;

}

 

if (BG_SaberInAttack(self->client->ps.saberMove))

{

if (self->client->ps.weaponstate == WEAPON_FIRING && self->client->ps.saberBlocked == BLOCKED_NONE)

{ //if we're firing and not blocking, then we're attacking.

return qtrue;

}

}

 

return qfalse;

}

 

typedef enum

{

LOCK_FIRST = 0,

LOCK_TOP = LOCK_FIRST,

LOCK_DIAG_TR,

LOCK_DIAG_TL,

LOCK_DIAG_BR,

LOCK_DIAG_BL,

LOCK_R,

LOCK_L,

LOCK_RANDOM

} sabersLockMode_t;

 

#define LOCK_IDEAL_DIST_TOP 32.0f

#define LOCK_IDEAL_DIST_CIRCLE 48.0f

 

#define SABER_HITDAMAGE 35

void WP_SaberBlockNonRandom( gentity_t *self, vec3_t hitloc, qboolean missileBlock );

 

qboolean WP_SabersCheckLock2( gentity_t *attacker, gentity_t *defender, sabersLockMode_t lockMode )

{

int attAnim, defAnim = 0;

float attStart = 0.5f;

float idealDist = 48.0f;

vec3_t attAngles, defAngles, defDir;

vec3_t newOrg;

vec3_t attDir;

float diff = 0;

trace_t trace;

pmove_t pmv;

 

//MATCH ANIMS

if ( lockMode == LOCK_RANDOM )

{

lockMode = (sabersLockMode_t)Q_irand( (int)LOCK_FIRST, (int)(LOCK_RANDOM)-1 );

}

switch ( lockMode )

{

case LOCK_TOP:

attAnim = BOTH_BF2LOCK;

defAnim = BOTH_BF1LOCK;

attStart = 0.5f;

idealDist = LOCK_IDEAL_DIST_TOP;

break;

case LOCK_DIAG_TR:

attAnim = BOTH_CCWCIRCLELOCK;

defAnim = BOTH_CWCIRCLELOCK;

attStart = 0.5f;

idealDist = LOCK_IDEAL_DIST_CIRCLE;

break;

case LOCK_DIAG_TL:

attAnim = BOTH_CWCIRCLELOCK;

defAnim = BOTH_CCWCIRCLELOCK;

attStart = 0.5f;

idealDist = LOCK_IDEAL_DIST_CIRCLE;

break;

 

 

 

 

That's about 1/10 of the full code.

 

The truth is that the guy who started this mod, knows jack **** about editing. He thinks he can just pick up the tools and be a god at it in three days. *Sigh*

Link to comment
Share on other sites

Originally posted by Emon

Hate to break it to you, but THIS MOD WILL FLOP. Why? Because there are NO good coders and NO good animators.

 

NO You say. Right, there probably is, but you're just negative. People are trying.

Link to comment
Share on other sites

Originally posted by j0shy

some one will sooner or later either

A) Figure out the code for SP

 

heheh.

oh I get how they did that, so I'll just code up the WHOLE game so I can edit SP

 

They'll release SP source eventually...

 

In regards to whats-his-name about there being NO coders that could comprehend the saber code.

 

I scanned that code and it's really fairly simple and elegent as well as decently documented. And I'm only second year comp-sci.

Any halfway coherent programmer could edit JK2 source, you just can't have people who pick C++ for dummies and then expect to make sweeping changes. It's not that there aren't any good programmers, it's that they don't float around on message boards looking for mod's to join.

 

 

Good luck on your mod. I hope to play it one day!

Link to comment
Share on other sites

There may be a lot of 'Nay' sayers around here, but I think this one has a lot of potential. It's definitely possible.

 

The lightsaber code is not necessarily complex, just lengthy. As was said above, it's fairly easy to understand, the actual challenge is being patient enough to stick with it and to work with the tedious task of expanding upon it. I doubt that this mod was intended to be released quickly - I wouldn't be surprised if it's two years or more down the road before it's finished. There's no need to rush, there's plenty of time to do what they wish to do; if JK2 is anything like its predecessor, it will be just as popular in two years as it is today.

 

A successful project is not born from the limitations of the code; if you stay within the boundaries of what you can do easily and what you cannot, and thus do not try to expand or push the limitations, you are ultimately destined to fail. The Kaiburr Saga was created with an idea in mind, without thought towards whether it could be done while lazily lounging about on a Saturday morning, and I think that in itself guarantees it will succeed, provided they have all of the necessary software. A person who says "I want to do this" has more drive to actually do it than a person who says "I would like to do this, but I'm going to do that instead because it's easier."

 

This thing really looks awesome. SoftImage is actually an easily acquirable piece of software, despite its insane price tag. Learning to use it is no more difficult than learning to program C++ (probably easier, actually), if you're interested in that field. With all of that said, I can't wait to see this when it's finished.

Link to comment
Share on other sites

Ah, and in response to Emon (I would've included this in the last post, but the forums went a bit haywire), about there being "NO good coders and NO good animators" on their project. Just curious, have you met said animators and coders on the Kaiburr team, or did you come to that conclusion through some other means? I haven't seen their work myself, but the very fact that they felt confident enough in their skills to sign up and participate in a team effort shows that they at least know what they're doing.

 

I wouldn't make that kind of judgement unless I had something to judge.

Link to comment
Share on other sites

i agree. the saber code isn't that complex like he said before, its just very lengthy. my friend and i tried something with it, and we were looking at the code, and its huge. this mod is VERY possible to create, and by the looks of it, it appears that they have a good start going on here. I for one am looking forward to this mod with very high hopes, and all you people who say that it can't be done, or may not be good enough, you try doing something like this. just try it.

Link to comment
Share on other sites

Originally posted by Woodster2003

Animator Must have some kind of animation program, experience in animating a plus

 

I have to agree with Andy867. There is no way they can make the animations without SoftImage. And that piece of software is expensive as hell. So really the so-called "animators" they need need not just have "some kind of animation program" they need SoftImage because that's where all of Raven's original animations for the character models came from.

 

As far as coding goes, that could happen if they stuck with it. But until they get someone that has a *legal* (key word there) copy of SoftImage they're screwed.

 

I forsee that being their only true obstacle is getting the animations. Otherwise if they can't, the mod will flop.

 

I'd play it though if they finished it right.

 

my .02

 

volrath

Link to comment
Share on other sites

Ok I am just wondring why would any one have to use SoftImage? yes they used it to make the game, couldunt you use Maya, 3ds Max (yea there expisive to) or even G-Max (free Download, made for gamers by makers of 3ds Max) or even some of the other 3d prgrams. then you might say the file name

there are ways to change file names and make them work

 

Im just wondring, im new to JK 2.

 

and with the code, any one can hack teh code and make it work for them, just nee dtime and some what smart.

Link to comment
Share on other sites

I never said NO CODERS could comprehend it, I just said it would be really tough (if I did, that isn't what I meant to say).

 

The problem is, is that it's near impossible to make a lightstaff, dual sabers, both having completely new systems and such. The saber in JO already has 300 animations or more, and I garuntee you there's no people out there willing to buy Softimage, learn it, then make 600 animations... Sure, you could have an ultra crappy system with like, 20 animations, but that would totally suck.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...