ensiform Posted August 29, 2017 Share Posted August 29, 2017 Have you checked the source code of the Serenity Jedi Engine Mod?The source for that doesn't exist to my knowledge. It was claimed as having been lost but the game is still released unfortunately without the source. Link to comment
Asgarath83 Posted August 30, 2017 Share Posted August 30, 2017 Trying to make dismember guns and i am half on my way .. still after killing the enemy his body doesnt react on eny hitloc mechanic. Even if i shot the bodies head g_debugdamage 1 code shows me that hitloc is set to - none. Is any way to fix that? I also find out that if g_sabermorerealistic is set to the default 0 (i think it is default value) saber is not using hit_loc as well.. only on the hands and arms. Someone knows where i can find the code fot the g_sabermorerealistic cheat command and how to fix this body issue? It is not like i want to shot the bodies. If i will shot the enemy with flechette for example - all of thoise shots will dismember the enemy into pieces. find on code all entry for g_saberrealisticcombat functionthere is something that maybe can like you on wp_saber.cpp pretty long and complex code, but you should check all the:qboolean WP_SaberApplyDamage function contains if ( victim->client && (victim->s.weapon == WP_SABER || (victim->client->NPC_class==CLASS_REBORN) || (victim->client->NPC_class==CLASS_WAMPA)) && !g_saberRealisticCombat->integer ) {//dmg vs other saber fighters is modded by hitloc and capped totalDmg[i] *= damageModifier[hitLoc[i]]; if ( hitLoc[i] == HL_NONE ) { maxDmg = 33*baseDamage; } else { maxDmg = 50*hitLocHealthPercentage[hitLoc[i]]*baseDamage;//*victim->client->ps.stats[STAT_MAX_HEALTH]*2.0f; } if ( maxDmg < totalDmg[i] ) { totalDmg[i] = maxDmg; } //dFlags |= DAMAGE_NO_HIT_LOC; } //clamp the dmg if ( victim->s.weapon != WP_SABER ) {//clamp the dmg between 25 and maxhealth /* if ( totalDmg[i] > victim->max_health ) { totalDmg[i] = victim->max_health; } else */if ( totalDmg[i] < 25 ) { totalDmg[i] = 25; } if ( totalDmg[i] > 100 )//+(50*g_spskill->integer) ) {//clamp using same adjustment as in NPC_Begin totalDmg[i] = 100;//+(50*g_spskill->integer); } } else {//clamp the dmg between 5 and 100 if ( !victim->s.number && totalDmg[i] > 50 ) {//never do more than half full health damage to player //prevents one-hit kills totalDmg[i] = 50; } else if ( totalDmg[i] > 100 ) { totalDmg[i] = 100; } else { if ( totalDmg[i] < 5 ) { totalDmg[i] = 5; } } } } Smoo likes this Link to comment
Asgarath83 Posted August 30, 2017 Share Posted August 30, 2017 also this on g_combat static qboolean G_Dismemberable2( gentity_t *self, int hitLoc ) { if ( self->client->dismembered ) {//cannot dismember me right now return qfalse; } if ( !debug_subdivision->integer && g_saberRealisticCombat->integer < 2 ) { if ( g_dismemberProbabilities->value <= 0.0f ) {//add the passed-in damage to the locationDamage array, check to see if it's taken enough damage to actually dismember if ( self->locationDamage[hitLoc] < (self->client->ps.stats[STAT_MAX_HEALTH]*hitLocHealthPercentage[hitLoc]) ) {//this location has not taken enough damage to dismember return qfalse; } } } return qtrue; } Smoo likes this Link to comment
Asgarath83 Posted August 30, 2017 Share Posted August 30, 2017 file that contain g_saberrealistcombat stuff:g_xcvar.h g_combat, g_main, ai_jedi, cg_ents, bg_pmove, wp_saber Smoo likes this Link to comment
Sir Crusher Posted November 9, 2017 Share Posted November 9, 2017 Is it possible to create a complex Cinematic fight with Icarus without adding every move as an animation, @@MGummelt? At the moment, I've looked at some scripts, and it looks like no script actually triggers a real attack, but fakes it by just playing an animation. General Howard likes this Link to comment
Xioth Posted November 10, 2017 Share Posted November 10, 2017 Hey, just made an account for JKHub to respond to a thread about manual saber blocking and figured I'd offer up my insights if anyone had any questions about the Jedi Outcast or Jedi Academy source code (SP or MP). It's been almost 15 years since I've written or even seen most of it, but hopefully if you ask me a specific question about a specific chunk of code (copy/paste a chunk or gimme a file name and line number) I can at least try to jog my memory and speak intelligently about it. I'll try to check back if people have questions.@@MGummelt How high does the Jedi Academy saber skill levels go to? Does it only go up to 3? Or do they both go higher? (I'm talking about FP_SABER_DEFENSE and FP_SABER_OFFENSE) Link to comment
Langerd Posted February 3, 2018 Share Posted February 3, 2018 I dont know if this thread is no longer active but i have a small question about dismember the enemies with the saber. If I will spawn 20 enemies on my map not all of them have working dismember - not like the Jedi Outcast .. this game has no limit with that. But i found out that Jk3 has this weird issue only with the lightsaber. When i dismember someone with the guns (I coded weapons to dismember enemies) and when i use script - everyone dismember. Lightsaber has this weird issue - when i kill 20 enemies the hitloc for lightsaber turns off. How to fix this or how to increase the limit of the entities that has wroking hitloc system to make saber work fine every time? Link to comment
Archangel35757 Posted February 3, 2018 Share Posted February 3, 2018 @@MGummelt - so we are having a discussion on Discord about the in-game size of the players in Star Wars Jedi Outcast/Jedi Academy... Legacy Quake3 documentation states the Game Units are: 8 game units equal 1 foot. Other sources stated that Q3 player models were 56 units tall... thus 7 feet tall using that scale. Please tell us... do Jedi Outcast and Jedi Academy use that same scale for game units (8 game units = 1 foot), or did Raven change the in-game scale? In 3dsMax the skeleton and Kyle are 100 units tall (to tip of his skull... hair is a smidge more) and ModView ruler shows Kyle at ~ 64 units tall. So by that standard Kyle would be 8 feet tall in game units. Is this correct? Smoo likes this Link to comment
Ramikad Posted February 3, 2018 Share Posted February 3, 2018 @@MGummelt - so we are having a discussion on Discord about the in-game size of the players in Star Wars Jedi Outcast/Jedi Academy... Legacy Quake3 documentation states the Game Units are: 8 game units equal 1 foot. Other sources stated that Q3 player models were 56 units tall... thus 7 feet tall using that scale. Please tell us... do Jedi Outcast and Jedi Academy use that same scale for game units(8 game units = 1 foot), or did Raven change the in-game scale? In 3dsMax the skeleton and Kyle are 100 units tall (to tip of his skull... hair is a smidge more) and ModView ruler shows Kyle at ~ 64 units tall. So by that standard Kyle would be 8 feet tall in game units. Is this correct? Seems like a player scale of 100 equals to about 64 units tall. If we go with the calculation that 64 units = 1.80 meters (which is the scale I generally use for everything), then 8 units equal to 22.5 cm, which is a bit more than 2/3 of one "international" foot measure (30.48 cm) - exactly 73.8% of one foot.Makes sense that Kyle isn't 2.40 meters tall this way Link to comment
Archangel35757 Posted February 3, 2018 Share Posted February 3, 2018 Yes, in-game characters (with a few exceptions... Desann) are 64 units tall. But what are the Game's units? This is different from using what Wookipedia says is Kyle's height of 1.8 meters (5'-11"). @@MGummelt Link to comment
Lancelot Posted February 3, 2018 Share Posted February 3, 2018 Don't expect that MGummelt will respond soon. The last time he was online was in August, and who knows if he has any time or interest at the moment to return here. Smoo likes this Link to comment
MGummelt Posted February 4, 2018 Author Share Posted February 4, 2018 Seems like a player scale of 100 equals to about 64 units tall. If we go with the calculation that 64 units = 1.80 meters (which is the scale I generally use for everything), then 8 units equal to 22.5 cm, which is a bit more than 2/3 of one "international" foot measure (30.48 cm) - exactly 73.8% of one foot.Makes sense that Kyle isn't 2.40 meters tall this way This is the correct answer. Back then, we used a height of 64 units for player height, because it divided nicely into 8 sets of 8 units each. Later games (COD, for example), players are 72 units high (because 6 feet is 72 inches, so this made a nice, neat 1 unit in radiant = 1 inch). \Wookipedia says is Kyle's height of 1.8 meters (5'-11"). @@MGummeltYes, but Kyle’s boots have a one-inch heal. Player characters are always 6 feet tall, regardless of what other sources say. Smoo likes this Link to comment
MGummelt Posted February 4, 2018 Author Share Posted February 4, 2018 I dont know if this thread is no longer active but i have a small question about dismember the enemies with the saber. If I will spawn 20 enemies on my map not all of them have working dismember - not like the Jedi Outcast .. this game has no limit with that. But i found out that Jk3 has this weird issue only with the lightsaber. When i dismember someone with the guns (I coded weapons to dismember enemies) and when i use script - everyone dismember. Lightsaber has this weird issue - when i kill 20 enemies the hitloc for lightsaber turns off. How to fix this or how to increase the limit of the entities that has wroking hitloc system to make saber work fine every time?Hmm, I don’t recall there being a limit to the number of dismemberments - this doesn’t happen to me when I play the Ladder map, for example - I can dismember every AI that spawns. Are you keeping the corpses or pieces around an abnormally long time? Does it stop working 100% of the time after 20 dismembered characters? If so, you should be able to debug the 21st character and see where in the code it rejects the dismemberment. Xioth likes this Link to comment
Archangel35757 Posted February 4, 2018 Share Posted February 4, 2018 @@MGummelt... ok... so in terms of making maps or content, we should just use 64 units = 1.8 meters. Thanks for the clarification. MGummelt likes this Link to comment
Langerd Posted February 4, 2018 Share Posted February 4, 2018 @MrGummeltOk! I Am 100% sure that this is code issue. And i may found the issue:In the wp_saber.cpp i found this lines and most importantly i found one line that i will select here with red font (I am not coder but maybe We will found a solution to fix this) qboolean WP_SaberDamageEffects( trace_t *tr, const vec3_t start, float length, float dmg, vec3_t dmgDir, vec3_t bladeVec, int enemyTeam, saberType_t saberType, saberInfo_t *saber, int bladeNum ){ int hitEntNum[MAX_G2_COLLISIONS];for ( int hen = 0; hen < MAX_G2_COLLISIONS; hen++ ){hitEntNum[hen] = ENTITYNUM_NONE;}//NOTE: = {0} does NOT work on anything but bytes?float hitEntDmgAdd[MAX_G2_COLLISIONS] = {0};float hitEntDmgSub[MAX_G2_COLLISIONS] = {0};vec3_t hitEntPoint[MAX_G2_COLLISIONS];vec3_t hitEntNormal[MAX_G2_COLLISIONS];vec3_t bladeDir;float hitEntStartFrac[MAX_G2_COLLISIONS] = {0};int trHitLoc[MAX_G2_COLLISIONS] = {HL_NONE};//same as 0int trDismemberLoc[MAX_G2_COLLISIONS] = {HL_NONE};//same as 0qboolean trDismember[MAX_G2_COLLISIONS] = {qfalse};//same as 0int i,z;int numHitEnts = 0;float distFromStart,doDmg;int hitEffect = 0;const char *trSurfName;gentity_t *hitEnt; VectorNormalize2( bladeVec, bladeDir ); for (z=0; z < MAX_G2_COLLISIONS; z++){if ( tr->G2CollisionMap[z].mEntityNum == -1 ){//actually, completely break out of this for loop since nothing after this in the aray should ever be valid eithercontinue;//break;//} CCollisionRecord &coll = tr->G2CollisionMap[z];//distFromStart = Distance( start, coll.mCollisionPosition );distFromStart = coll.mDistance; /*//FIXME: (distFromStart/length) is not guaranteed to be from 0 to 1... *sigh*...if ( length && saberHitFraction < 1.0f && (distFromStart/length) < 1.0f && (distFromStart/length) > saberHitFraction ){//a saber was hit before this point, don't count it#ifndef FINAL_BUILDif ( d_saberCombat->integer ){gi.Printf( S_COLOR_MAGENTA"rejecting G2 collision- %4.2f farther than saberHitFraction %4.2f\n", (distFromStart/length), saberHitFraction );}#endifcontinue;}*/ for ( i = 0; i < numHitEnts; i++ ){if ( hitEntNum == coll.mEntityNum ){//we hit this ent before//we'll want to add this disthitEntDmgAdd = distFromStart;break;}}if ( i == numHitEnts ){//first time we hit this entif ( numHitEnts == MAX_G2_COLLISIONS ){//hit too many damn ents!continue;}hitEntNum[numHitEnts] = coll.mEntityNum;if ( !coll.mFlags ){//hmm, we came out first, so we must have started inside//we'll want to subtract this disthitEntDmgAdd[numHitEnts] = distFromStart;}else{//we're entering the model//we'll want to subtract this disthitEntDmgSub[numHitEnts] = distFromStart;}//keep track of how far in the damage was donehitEntStartFrac[numHitEnts] = hitEntDmgSub[numHitEnts]/length;//remember the entrance pointVectorCopy( coll.mCollisionPosition, hitEntPoint[numHitEnts] );//remember the normal of the face we hitVectorCopy( coll.mCollisionNormal, hitEntNormal[numHitEnts] );VectorNormalize( hitEntNormal[numHitEnts] ); //do the effect //FIXME: check material rather than team?hitEnt = &g_entities[hitEntNum[numHitEnts]];if ( hitEnt&& hitEnt->client&& coll.mModelIndex > 0 ){//hit a submodel on the enemy, not their actual body!if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum )&& saber->hitOtherEffect ){hitEffect = saber->hitOtherEffect;}else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum )&& saber->hitOtherEffect2 ){hitEffect = saber->hitOtherEffect2;}else{hitEffect = G_EffectIndex( hit_sparks );}}else{if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum )&& saber->hitPersonEffect ){hitEffect = saber->hitPersonEffect;}else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum )&& saber->hitPersonEffect2 ){hitEffect = saber->hitPersonEffect2;}else{hitEffect = G_EffectIndex( hit_blood_sparks );}}if ( hitEnt != NULL ){if ( hitEnt->client ){class_t npc_class = hitEnt->client->NPC_class;if ( npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE || npc_class == CLASS_REMOTE || npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || npc_class == CLASS_PROTOCOL || npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY ){if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum )&& saber->hitOtherEffect ){hitEffect = saber->hitOtherEffect;}else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum )&& saber->hitOtherEffect2 ){hitEffect = saber->hitOtherEffect2;}else{hitEffect = G_EffectIndex( hit_sparks );}}}else{// So sue me, this is the easiest way to check to see if this is the turbo laser from t2_wedge,// in which case I don't want the saber effects goin off on it.if ( (hitEnt->flags&FL_DMG_BY_HEAVY_WEAP_ONLY)&& hitEnt->takedamage == qfalse&& Q_stricmp( hitEnt->classname, "misc_turret" ) == 0 ){continue;}else{if ( dmg ){//only do these effects if actually trying to damage the thing...if ( (hitEnt->svFlags&SVF_BBRUSH)//a breakable brush&& ( (hitEnt->spawnflags&1)//INVINCIBLE||(hitEnt->flags&FL_DMG_BY_HEAVY_WEAP_ONLY) )//HEAVY weapon damage only){//no hit effect (besides regular client-side one)hitEffect = 0;}else{if ( !WP_SaberBladeUseSecondBladeStyle( saber, bladeNum )&& saber->hitOtherEffect ){hitEffect = saber->hitOtherEffect;}else if ( WP_SaberBladeUseSecondBladeStyle( saber, bladeNum )&& saber->hitOtherEffect2 ){hitEffect = saber->hitOtherEffect2;}else{hitEffect = G_EffectIndex( hit_sparks );}}}}}} //FIXME: play less if damage is less?if ( !g_saberNoEffects ){if ( hitEffect != 0 ){//FIXME: when you have multiple blades hitting someone for many sequential server frames, this can get a bit chuggy!G_PlayEffect( hitEffect, coll.mCollisionPosition, coll.mCollisionNormal );}} //Get the hit location based on surface nameif ( (hitLoc[hitEntNum[numHitEnts]] == HL_NONE && trHitLoc[numHitEnts] == HL_NONE)|| (hitDismemberLoc[hitEntNum[numHitEnts]] == HL_NONE && trDismemberLoc[numHitEnts] == HL_NONE)|| (!hitDismember[hitEntNum[numHitEnts]] && !trDismember[numHitEnts]) ){//no hit loc set for this ent this damage cycle yet//FIXME: find closest impact surf *first* (per ent), then call G_GetHitLocFromSurfName?//FIXED: if hit multiple ents in this collision record, these trSurfName, trDismember and trDismemberLoc will get stomped/confused over the multiple ents I hittrSurfName = gi.G2API_GetSurfaceName( &g_entities[coll.mEntityNum].ghoul2[coll.mModelIndex], coll.mSurfaceIndex );trDismember[numHitEnts] = G_GetHitLocFromSurfName( &g_entities[coll.mEntityNum], trSurfName, &trHitLoc[numHitEnts], coll.mCollisionPosition, dmgDir, bladeDir, MOD_SABER, saberType );if ( trDismember[numHitEnts] ){trDismemberLoc[numHitEnts] = trHitLoc[numHitEnts];}/*if ( trDismember[numHitEnts] ){Com_Printf( S_COLOR_RED"Okay to dismember %s on ent %d\n", hitLocName[trDismemberLoc[numHitEnts]], hitEntNum[numHitEnts] );}else{Com_Printf( "Hit (no dismember) %s on ent %d\n", hitLocName[trHitLoc[numHitEnts]], hitEntNum[numHitEnts] );}*/}numHitEnts++;}} Ok now the observations - THIS Line is (i am 100% sure) for the entities (Mostly for npc's because they have hitloc system) that are one of the 20th - 40th etc. loaded glm model on the map. I dont know if this for optimalization purpose but for some reason game turns off the dismember for npc's completely. It hit limit but i dont know what is this limit and where i can increase it. The best solution would be to remove this system COMPLETELY. And now some weird stuff.. i was checking some things and see how they works in the game and i end up confused... When i removed these lines from the code - wp_saber.cpp2275 to 2299 something weird... happend. The enemies are now completely not dismember able... ALL of them. So it screwed up the npc's that were working. I turned on the g_debugdamage code and i see this Hitloc shows -none- so game doesnt reconize the saber hit as the dismember hit. .. and the this is not the weirdest part...in the begining of the code i changed the float hitEntStartFrac[MAX_G2_COLLISIONS] = {0};int trHitLoc[MAX_G2_COLLISIONS] = {HL_NONE};//same as 0 HL_MAXint trDismemberLoc[MAX_G2_COLLISIONS] = {HL_NONE};//same as 0 to HL_MAXqboolean trDismember[MAX_G2_COLLISIONS] = {qfalse};//same as 0 Aaaaaandddd... this is the part i am 100% SURE that these lines in this code optimalize the game to turn of the dismember for reaching the limit or bytes that game is using. Blocks only for saber.. of course.The enemies after this change.... are completely invincible because the hitloc on the saber .. shows (null). I created a bug (for observation purpose of course) and i cant kill the enemies... THIS IS NOT TRUE because ENEMIES with working dismemberment (as i said in one of the threads .. i played my cloud city map so often that i remember which enemy i can dismember and which not) ARE DYING WITH THE SABER *Mindblow* Soooo the enemies with not working dismember are not dying with the lightsaber hit but the guys with the dismember working - are dying.. with dismember. Here are screens to prove it to all of you.AAAAAA how to fix this!!!! Grrryyyyrrrrrwwrwrw Smoo likes this Link to comment
Daedra Posted February 4, 2018 Share Posted February 4, 2018 @MrGummelt Ok! I Am 100% sure that this is code issue. And i may found the issue: In the wp_saber.cpp i found this lines and most importantly i found one line that i will select here with red font (I am not coder but maybe We will found a solution to fix this) Ok now the observations - THIS Line is (i am 100% sure) for the entities (Mostly for npc's because they have hitloc system) that are one of the 20th - 40th etc. loaded glm model on the map. I dont know if this for optimalization purpose but for some reason game turns off the dismember for npc's completely. It hit limit but i dont know what is this limit and where i can increase it. The best solution would be to remove this system COMPLETELY. And now some weird stuff.. i was checking some things and see how they works in the game and i end up confused... When i removed these lines from the code - wp_saber.cpp 2275 to 2299 something weird... happend. The enemies are now completely not dismember able... ALL of them. So it screwed up the npc's that were working. I turned on the g_debugdamage code and i see this Hitloc shows -none- so game doesnt reconize the saber hit as the dismember hit. .. and the this is not the weirdest part... in the begining of the code i changed the Aaaaaandddd... this is the part i am 100% SURE that these lines in this code optimalize the game to turn of the dismember for reaching the limit or bytes that game is using. Blocks only for saber.. of course. The enemies after this change.... are completely invincible because the hitloc on the saber .. shows (null). I created a bug (for observation purpose of course) and i cant kill the enemies... THIS IS NOT TRUE because ENEMIES with working dismemberment (as i said in one of the threads .. i played my cloud city map so often that i remember which enemy i can dismember and which not) ARE DYING WITH THE SABER *Mindblow* Soooo the enemies with not working dismember are not dying with the lightsaber hit but the guys with the dismember working - are dying.. with dismember. Here are screens to prove it to all of you. AAAAAA how to fix this!!!! Grrryyyyrrrrrwwrwrw I understand that it is annoying.. but.. Wasa, SomaZ, Xioth and 6 others like this Link to comment
MGummelt Posted February 5, 2018 Author Share Posted February 5, 2018 float hitEntStartFrac[MAX_G2_COLLISIONS] = {0};int trHitLoc[MAX_G2_COLLISIONS] = {HL_NONE};//same as 0 HL_MAXint trDismemberLoc[MAX_G2_COLLISIONS] = {HL_NONE};//same as 0 to HL_MAXqboolean trDismember[MAX_G2_COLLISIONS] = {qfalse};//same as 0 I'll have to look at the code to see if I see any issues, but I can tell you that changing the HL_NONE above to HL_MAX is not a good idea. Those lines are declaring and initializing arrays of data - basically creating an array of size MAX_G2_COLLISIONS and filling it in with blank data. By setting them to HL_MAX instead of HL_NONE, all you're doing is initializing those arrays to something other than 0, which would make the code think that every part of the array has already been filled in with a hit location, which would make it think it's out of collisions. Without looking at your code, all I can imagine is that whatever you're doing to cause hit location/dismemberment with guns is filling up this array (is MAX_G2_COLLISIONS == 20?) and somehow your code is not clearing that array for the next frame as it should. I'd look and see where those arrays are referenced and find where they are getting cleared/reset back to their default values (0, HL_NONE, HL_NONE and qfalse, respectively). That should be happening at the end or start of each frame somewhere. If those global arrays are never cleared, they will fill up and you will no longer get any more valid hitlocs or dismemberments. Boothand, Noodle and Smoo like this Link to comment
Langerd Posted February 9, 2018 Share Posted February 9, 2018 I'll have to look at the code to see if I see any issues, but I can tell you that changing the HL_NONE above to HL_MAX is not a good idea. Those lines are declaring and initializing arrays of data - basically creating an array of size MAX_G2_COLLISIONS and filling it in with blank data. By setting them to HL_MAX instead of HL_NONE, all you're doing is initializing those arrays to something other than 0, which would make the code think that every part of the array has already been filled in with a hit location, which would make it think it's out of collisions. Without looking at your code, all I can imagine is that whatever you're doing to cause hit location/dismemberment with guns is filling up this array (is MAX_G2_COLLISIONS == 20?) and somehow your code is not clearing that array for the next frame as it should. I'd look and see where those arrays are referenced and find where they are getting cleared/reset back to their default values (0, HL_NONE, HL_NONE and qfalse, respectively). That should be happening at the end or start of each frame somewhere. If those global arrays are never cleared, they will fill up and you will no longer get any more valid hitlocs or dismemberments.The point is i always had this issue in jk3 - but not in jk2. Check it by yourself - spawn 20-30 enemies and just try kill them all. I bet that some guys wont dismember. I rly hope to find a way to remove this code fence.It mostly happens on the large maps too. Link to comment
Langerd Posted February 10, 2018 Share Posted February 10, 2018 I FOUND THE ANSWER!!! The change of the code is simple In the beginning of the wp_saber.cpp we have line like this - #define JK2_RAGDOLL_GRIPNOHEALTH #define MAX_SABER_VICTIMS 100static int victimEntityNum[MAX_SABER_VICTIMS];static float totalDmg[MAX_SABER_VICTIMS];static vec3_t dmgDir[MAX_SABER_VICTIMS];static vec3_t dmgNormal[MAX_SABER_VICTIMS];static vec3_t dmgBladeVec[MAX_SABER_VICTIMS];static vec3_t dmgSpot[MAX_SABER_VICTIMS];static float dmgFraction[MAX_SABER_VICTIMS];static int hitLoc[MAX_SABER_VICTIMS];static qboolean hitDismember[MAX_SABER_VICTIMS];static int hitDismemberLoc[MAX_SABER_VICTIMS];static vec3_t saberHitLocation, saberHitNormal={0,0,1.0};static float saberHitFraction;static float sabersCrossed;static int saberHitEntity;static int numVictims = 0;We must change : #define MAX_SABER_VICTIMS 100i change to 600 and it works fine. No issues so far - And for bonus i played entire cloud city map with corpseremoval time set to 0. Every enemy is dismemberable with the saber! Many thanks (i will check the second thing - what will happen if i will set this value to 1 or 0) . Noodle likes this Link to comment
MGummelt Posted February 10, 2018 Author Share Posted February 10, 2018 So does this only happen if you set the corpses to never remove? I had asked that earlier... Link to comment
Langerd Posted February 10, 2018 Share Posted February 10, 2018 So does this only happen if you set the corpses to never remove? I had asked that earlier...No. It only happend after multiple enemies on the map - already spawned - around 20 but it acted kinda weird. When 30 npc's were spawning in the begining of my map (so instantly when i play the map) it is random which npc will be like kebab and which not. (but not exactly.. as i said before - every enemy i killed on my map i remembered which will lose arm and which will not) The game is removing this likely to optimimalize itself... And it happens only with the lightsaber. Link to comment
MGummelt Posted February 11, 2018 Author Share Posted February 11, 2018 No. It only happend after multiple enemies on the map - already spawned - around 20 but it acted kinda weird. When 30 npc's were spawning in the begining of my map (so instantly when i play the map) it is random which npc will be like kebab and which not. (but not exactly.. as i said before - every enemy i killed on my map i remembered which will lose arm and which will not) The game is removing this likely to optimimalize itself... And it happens only with the lightsaber. Well, that doesn't make any sense. MAX_SABER_VICTIMS is 16 in the vanilla code, it's not 100. I don't know what codebase you're using. It that OpenJK or something? The victimEntityNum array exists just to prevent a single saber damage check from hitting more than 16 entities in a single frame. It gets reset at the start of every call to saber damage checking (so for each blade, it's reset each frame, basically). There's no way you should be hitting that limit - if you need to raise it over 16, something is going very wrong in your code. 100 is insane, much less 600! Do you still have this bit that clears the victimEntityNum array at the top of WP_SaberDamageTrace()? void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) { vec3_t mp1, mp2, md1, md2, baseOld, baseNew, baseDiff, endOld, endNew, bladePointOld, bladePointNew; float tipDmgMod = 1.0f; float baseDamage; int baseDFlags = 0; qboolean hit_wall = qfalse; qboolean brokenParry = qfalse; for ( int ven = 0; ven < MAX_SABER_VICTIMS; ven++ ) { victimEntityNum[ven] = ENTITYNUM_NONE; } If not, then the victimEntityNum array could start getting filled up and it will think you already hit that ent that frame - when you really hit it some previous frame. But even that seems unlikely. Have you tried actually debug-stepping through the saber damage routine (starting at the top of WP_SaberDamageTrace) and seeing where your bad trace returns before the damage? That would be the one sure way to know what's going wrong. Also, turn on the visual saber trace lines, they can be helpful when debugging what's going on with saber traces. d_saberCombat 2 Should turn them on. I think you will need to compile a debug build for those to work though? timescale 0.1 Will slow things down enough to see the saber traces in action as you swing. Smoo likes this Link to comment
Xioth Posted February 11, 2018 Share Posted February 11, 2018 Well, that doesn't make any sense. MAX_SABER_VICTIMS is 16 in the vanilla code, it's not 100. I don't know what codebase you're using. It that OpenJK or something? The victimEntityNum array exists just to prevent a single saber damage check from hitting more than 16 entities in a single frame. It gets reset at the start of every call to saber damage checking (so for each blade, it's reset each frame, basically). There's no way you should be hitting that limit - if you need to raise it over 16, something is going very wrong in your code. 100 is insane, much less 600! Do you still have this bit that clears the victimEntityNum array at the top of WP_SaberDamageTrace()? void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) { vec3_t mp1, mp2, md1, md2, baseOld, baseNew, baseDiff, endOld, endNew, bladePointOld, bladePointNew; float tipDmgMod = 1.0f; float baseDamage; int baseDFlags = 0; qboolean hit_wall = qfalse; qboolean brokenParry = qfalse; for ( int ven = 0; ven < MAX_SABER_VICTIMS; ven++ ) { victimEntityNum[ven] = ENTITYNUM_NONE; } If not, then the victimEntityNum array could start getting filled up and it will think you already hit that ent that frame - when you really hit it some previous frame. But even that seems unlikely. Have you tried actually debug-stepping through the saber damage routine (starting at the top of WP_SaberDamageTrace) and seeing where your bad trace returns before the damage? That would be the one sure way to know what's going wrong. Also, turn on the visual saber trace lines, they can be helpful when debugging what's going on with saber traces. d_saberCombat 2 Should turn them on. I think you will need to compile a debug build for those to work though? timescale 0.1 Will slow things down enough to see the saber traces in action as you swing.@@MGummelt How high does FP_SABEROFFENSE and DEFENSE go up to? Link to comment
Langerd Posted February 11, 2018 Share Posted February 11, 2018 Well, that doesn't make any sense. MAX_SABER_VICTIMS is 16 in the vanilla code, it's not 100. I don't know what codebase you're using. It that OpenJK or something? The victimEntityNum array exists just to prevent a single saber damage check from hitting more than 16 entities in a single frame. It gets reset at the start of every call to saber damage checking (so for each blade, it's reset each frame, basically). There's no way you should be hitting that limit - if you need to raise it over 16, something is going very wrong in your code. 100 is insane, much less 600! Do you still have this bit that clears the victimEntityNum array at the top of WP_SaberDamageTrace()? void WP_SaberDamageTrace( gentity_t *ent, int saberNum, int bladeNum ) { vec3_t mp1, mp2, md1, md2, baseOld, baseNew, baseDiff, endOld, endNew, bladePointOld, bladePointNew; float tipDmgMod = 1.0f; float baseDamage; int baseDFlags = 0; qboolean hit_wall = qfalse; qboolean brokenParry = qfalse; for ( int ven = 0; ven < MAX_SABER_VICTIMS; ven++ ) { victimEntityNum[ven] = ENTITYNUM_NONE; } If not, then the victimEntityNum array could start getting filled up and it will think you already hit that ent that frame - when you really hit it some previous frame. But even that seems unlikely. Have you tried actually debug-stepping through the saber damage routine (starting at the top of WP_SaberDamageTrace) and seeing where your bad trace returns before the damage? That would be the one sure way to know what's going wrong. Also, turn on the visual saber trace lines, they can be helpful when debugging what's going on with saber traces. d_saberCombat 2 Should turn them on. I think you will need to compile a debug build for those to work though? timescale 0.1 Will slow things down enough to see the saber traces in action as you swing.Hmm sorry fo bad info - maybe i changed it and thought that it is set to 100 by default but i changed this value. ... Well sorry to tell You but i am not 100% exactly sure what You mean . The thing i have done worked .. But i will keep it on mind and try to understand what i need to change to fix this. If increasing this value may cause problems - i will try to what You showed me or find something new. Many Thanks for answer! Link to comment
Username Posted February 19, 2018 Share Posted February 19, 2018 @@MGummelt Do npcs get a health increase depending on difficulty? If so, how much? Link to comment
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