r1ch.net forums
* Home Help Search Login Register
r1ch.net  |  General  |  General Discussion  |  Topic: Trying to fix the Siamese Twins problem...
Pages: 1 2 [3]  All
Print
Author Topic: Trying to fix the Siamese Twins problem...  (Read 37110 times)
hajas
Member

Posts: 44



« Reply #30 on: June 11, 2007, 09:13:29 am »

here the pseudocode of my solution...

Quote
while can find "origin" into String do {
   strReplaceFirst (String, origin, fhajas); // replace FIRST origin for fhajas in the string
   posA = find 3rd space after fhajas;
   posB = find next " after posA;
   Str1 = GetSubstring (String[0],posA);
   Str2 = GetSubstring (posB,String[size]);
   num = GetSubstring (posA, posB);
   ToNumber(num) += 15;
   String = Str1 + num + Str2;
}
strReplace (String, fhajas, origin) // replace ALL fhajas for origin in the string

any better ideas?
« Last Edit: June 11, 2007, 09:21:05 am by hajas » Logged
hajas
Member

Posts: 44



« Reply #31 on: June 11, 2007, 11:50:09 am »

well, I realize that I can't change all origins, because I'll cause problems to other classes....
so I can only change info_player_deathmatch and info_player_start classes

so here the new pseudocode to solve this:

Quote
set working = 1;
while working == 1 {
   if "{" not found{
      set working = 0;
   else{
       subs = GetSubstring(String, first {, first });
      Str1 = GetSubstring (String[0], subs[0]);
      Str2 = GetSubstring (subs[size],String[size]);
      if found (info_player_deathmatch || info_player_start) in subs {
           find "origin" location;
         posA = find 3rd space after origin location;
         posB = find next " after posA;
         Subs1 = GetSubstring (subs[0],posA);
         Subs2 = GetSubstring (posB,subs[size]);
         num = GetSubstring (posA, posB);
         ToNumber(num) += 15;
           subs = Subs1 + num + Subs2;
         ReplaceAll (subs, {, [);
         ReplaceAll (subs, }, ]);
      }
   }
}
ReplaceAll (String, [, {);
ReplaceAll (String, ], });

any inputs?
« Last Edit: June 11, 2007, 12:16:30 pm by hajas » Logged
R1CH
Administrator
Member

Posts: 2625



« Reply #32 on: June 11, 2007, 11:53:39 am »

You may want to look in Com_Parse, Q2 already has a tokenizer you can use.
Logged
hajas
Member

Posts: 44



« Reply #33 on: June 12, 2007, 01:35:37 pm »

hmmm... very insteresting stuff...

where I set the token the string? I don't get it...

I was thinking in do something like this with strtok inside the loop:

Code:
SubString = strtok(String,'}');

correct me if I'm wrong, with that I'll have everything in the String until the } point copied to that SubString variable.

than I can work with that substring, and create another variable that will save the new string.

and when execute again will copy from the next char after last char copied first, until the next }, and goes on...

so in each passage of the loop will copy each entity to that SubString... am I right?

thanks again m8!
Logged
hajas
Member

Posts: 44



« Reply #34 on: June 13, 2007, 03:04:13 pm »

well, I quit to try find good functions, and done everything by hand... so please take a look at this code:

Code:
static void CM_LoadEntityString (const byte *data, const lump_t *l){

    char   *game = Cvar_VariableString("fs_game");
int i, j, Tam, TamNew;
int PA, PB, PC, PD, PL, L1, Num, Espaco, Aspas;
char *p, *ori, *HStr, *NewStr, *FinalStr;
char *PartA, *PartB, *PartC, *PartD;

cm_numEntityChars = l->fileLen;
if (cm_numEntityChars < 1)
return;
if (cm_numEntityChars > MAX_MAP_ENTSTRING)
Com_Error(ERR_DROP, "CM_LoadMap: map '%s' has too large entity lump", cm_map);

cm_entityString = Hunk_Alloc(cm_numEntityChars + 1);
memcpy(cm_entityString, data + l->fileOfs, cm_numEntityChars);

if (!Q_stricmp(game, "arena")){
HStr = cm_entityString; // copy the original string to mine
Tam = strlen(HStr);
      // do string manipulation over cm_entityString
i=0;
j=0;
   while (j<Tam){
   while (HStr[j] != '}'){ // copy to NewStr each Class
   NewStr[i] = HStr[j];
   i++;j++;
   }
   NewStr[i] = HStr[j]; //add '}' to the end of the class
   p = strstr(NewStr, "info_player"); //see if is a spawn class
   if (!p){
   FinalStr = strcat( FinalStr, NewStr ); //if not, save and go to the next class
   }else{
   //if yes, start the hard work
               ori = strstr(NewStr, "origin"); //find the origin position
   // than add +8 (origin" ") to that position, which will reach the numbers of the axis
   L1=ori+8; //------------------------------------------------- NEED TO CONVERT????!!!
   // find PartA from 0 to L1
   for (PA=0;PA==L1;PA++) //seta parte 1/4
   {
PartA[PA]=NewStr[PA];
   }
   PL=PA; //creat a new var to control the place in NewStr
   Espaco=0; //set to have zero spaces count
   // find PartB from start of numbers until 2nd space
   for (PB=0;Espaco!=2;PB++) //set part 2/4
   {
PL++;
PartB[PB]=NewStr[PL];
if (PartB[PB]==" ")
Espaco++;
   }
   Aspas=0; //set to plics to zero count
   // find PartC which is the Number, until reach next "
   for (PC=0;Aspas==1;PC++) //set part 3/4 = Num
   {
   PL++;
if (NewStr[PL]=='"')
Aspas = 1;
else
PartC[PC]=NewStr[PL];
   }
   TamNew = strlen(NewStr); //find the size of NewStr
   // find PartD from " after number until the end of class
   for (PD=0;PL==TamNew;PD++) //set part 4/4
   {
   PartD[PD]=NewStr[PL];
   PL++;
   }
   // Convert to Number
   Num=PartC; //------------------------------------------------- HOW TO CONVERT????!!!
   Num += 15; //add 15
   NewStr = strcat( PartA, PartB ); // make all 4 parts into one
   NewStr = strcat( NewStr, Num ); //------------------------------------------------- NEED TO CONVERT????!!!
   NewStr = strcat( NewStr, PartD );
   FinalStr = strcat( FinalStr, NewStr ); // add all NewStr to FinalStr
   }
i=0; //NewStr count to zero
j++;
NewStr=""; //erase NewStr
   }
cm_entityString = FinalStr; //replace the original by the new altered one
}
}

ok, I know need few funcions of convertions or some other thing must be done in the wrong way... please fix everything that you find not good.

thanks a lot!
« Last Edit: June 14, 2007, 09:24:08 am by hajas » Logged
hajas
Member

Posts: 44



« Reply #35 on: June 14, 2007, 08:35:47 am »

I updated the code with a more commented version fixing some small problems too.
« Last Edit: June 14, 2007, 09:27:16 am by hajas » Logged
R1CH
Administrator
Member

Posts: 2625



« Reply #36 on: June 14, 2007, 10:49:42 am »

You can use atoi to convert a string to an integer, eg i = atoi("3") will set i to 3. To go the other way, you need to use sprintf into a buffer, eg char buff[16]; sprintf (buff, "%d", i);
Logged
hajas
Member

Posts: 44



« Reply #37 on: June 14, 2007, 11:34:41 am »

I did with atoi function... but look what I found in Q2E code (probally the same as Q2):

Code:
/*
==============
SpawnEntities

Creates a server's entity / program execution context by
parsing textual entity definitions out of an ent file.
==============
*/
void SpawnEntities (char *mapname, char *entities, char *spawnpoint)
{
edict_t *ent;
int inhibit;
char *com_token;
int i;
float skill_level;

skill_level = floor (skill->value);
if (skill_level < 0)
skill_level = 0;
if (skill_level > 3)
skill_level = 3;
if (skill->value != skill_level)
gi.cvar_forceset("skill", va("%f", skill_level));

SaveClientData ();

gi.FreeTags (TAG_LEVEL);

memset (&level, 0, sizeof(level));
memset (g_edicts, 0, game.maxentities * sizeof (g_edicts[0]));

strncpy (level.mapname, mapname, sizeof(level.mapname)-1);
strncpy (game.spawnpoint, spawnpoint, sizeof(game.spawnpoint)-1);

// set client fields on player ents
for (i=0 ; i<game.maxclients ; i++)
g_edicts[i+1].client = game.clients + i;

ent = NULL;
inhibit = 0;

// parse ents
while (1)
{
// parse the opening brace
com_token = Com_Parse (&entities);
if (!entities)
break;
if (com_token[0] != '{')
gi.error ("ED_LoadFromFile: found %s when expecting {",com_token);

if (!ent)
ent = g_edicts;
else
ent = G_Spawn ();
entities = ED_ParseEdict (entities, ent); //--------------------------------LOOK HERE!!!

// yet another map hack
if (!Q_stricmp(level.mapname, "command") && !Q_stricmp(ent->classname, "trigger_once") && !Q_stricmp(ent->model, "*27"))
ent->spawnflags &= ~SPAWNFLAG_NOT_HARD;

// remove things (except the world) from different skill levels or deathmatch
if (ent != g_edicts)
{
if (deathmatch->value)
{
if ( ent->spawnflags & SPAWNFLAG_NOT_DEATHMATCH )
{
G_FreeEdict (ent);
inhibit++;
continue;
}
}
else
{
if ( /* ((coop->value) && (ent->spawnflags & SPAWNFLAG_NOT_COOP)) || */
((skill->value == 0) && (ent->spawnflags & SPAWNFLAG_NOT_EASY)) ||
((skill->value == 1) && (ent->spawnflags & SPAWNFLAG_NOT_MEDIUM)) ||
(((skill->value == 2) || (skill->value == 3)) && (ent->spawnflags & SPAWNFLAG_NOT_HARD))
)
{
G_FreeEdict (ent);
inhibit++;
continue;
}
}

ent->spawnflags &= ~(SPAWNFLAG_NOT_EASY|SPAWNFLAG_NOT_MEDIUM|SPAWNFLAG_NOT_HARD|SPAWNFLAG_NOT_COOP|SPAWNFLAG_NOT_DEATHMATCH);
}

ED_CallSpawn (ent);
}

gi.dprintf ("%i entities inhibited\n", inhibit);

#ifdef DEBUG
i = 1;
ent = EDICT_NUM(i);
while (i < globals.num_edicts) {
if (ent->inuse != 0 || ent->inuse != 1)
Com_DPrintf("Invalid entity %d\n", i);
i++, ent++;
}
#endif

G_FindTeams ();

PlayerTrail_Init ();
}

than call this

Code:
/*
====================
ED_ParseEdict

Parses an edict out of the given string, returning the new position
ed should be a properly initialized empty edict.
====================
*/
char *ED_ParseEdict (char *data, edict_t *ent)
{
qboolean init;
char keyname[256];
char *com_token;

init = false;
memset (&st, 0, sizeof(st));

// go through all the dictionary pairs
while (1)
{
// parse key
com_token = Com_Parse (&data);
if (com_token[0] == '}')
break;
if (!data)
gi.error ("ED_ParseEntity: EOF without closing brace");

strncpy (keyname, com_token, sizeof(keyname)-1);

// parse value
com_token = Com_Parse (&data);
if (!data)
gi.error ("ED_ParseEntity: EOF without closing brace");

if (com_token[0] == '}')
gi.error ("ED_ParseEntity: closing brace without data");

init = true;

// keynames with a leading underscore are used for utility comments,
// and are immediately discarded by quake
if (keyname[0] == '_')
continue;

ED_ParseField (keyname, com_token, ent);
}

if (!init)
memset (ent, 0, sizeof(*ent));

return data;
}

which call this:

Code:
/*
===============
ED_ParseField

Takes a key/value pair and sets the binary values
in an edict
===============
*/
void ED_ParseField (char *key, char *value, edict_t *ent)
{
field_t *f;
byte *b;
float v;
vec3_t vec;

for (f=fields ; f->name ; f++)
{
if (!(f->flags & FFL_NOSPAWN) && !Q_stricmp(f->name, key))
{ // found it
if (f->flags & FFL_SPAWNTEMP)
b = (byte *)&st;
else
b = (byte *)ent;

switch (f->type)
{
case F_LSTRING:
*(char **)(b+f->ofs) = ED_NewString (value);
break;
case F_VECTOR:
sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]);
((float *)(b+f->ofs))[0] = vec[0];
((float *)(b+f->ofs))[1] = vec[1];
((float *)(b+f->ofs))[2] = vec[2]; //-------------------------------------------- is that value what I'm looking for to update? (if was info_player)
break;
case F_INT:
*(int *)(b+f->ofs) = atoi(value);
break;
case F_FLOAT:
*(float *)(b+f->ofs) = atof(value);
break;
case F_ANGLEHACK:
v = atof(value);
((float *)(b+f->ofs))[0] = 0;
((float *)(b+f->ofs))[1] = v;
((float *)(b+f->ofs))[2] = 0;
break;
case F_IGNORE:
break;
}
return;
}
}
gi.dprintf ("%s is not a field\n", key);
}


« Last Edit: June 14, 2007, 11:37:33 am by hajas » Logged
R1CH
Administrator
Member

Posts: 2625



« Reply #38 on: June 14, 2007, 11:37:17 am »

As I said, Q2 already has tokenizers / parsers for entity strings. You can use those, or you can make your own.
Logged
hajas
Member

Posts: 44



« Reply #39 on: June 14, 2007, 12:05:55 pm »

ok.... did you succeed in change the RA2 DLL with an Hex/Decompiler?
Logged
hajas
Member

Posts: 44



« Reply #40 on: June 14, 2007, 02:19:25 pm »

wth! will be so easy to fix that if I have the RA2 source!!!

these functions are great, but are all in DLL part, so I can't change... and if I remake then to only get the values, I will need to reconstruct the string anyway, and will be really hard to do that in that way... so my code was the best solution to do that via code until now...

please let me know if you did any progress in editing direct the RA2 DLL.

thanks m8!
Logged
hajas
Member

Posts: 44



« Reply #41 on: June 20, 2007, 03:26:36 pm »

any news r1ch?
Logged
R1CH
Administrator
Member

Posts: 2625



« Reply #42 on: June 20, 2007, 03:46:21 pm »

RA2 spawn code is quite different from vanilla Q2DM, so I wasn't able to trace where the origin is set. More specifically, the ent->s.origin[2] += 1 is not present in RA2.
Logged
hajas
Member

Posts: 44



« Reply #43 on: June 21, 2007, 07:41:14 am »

thanks m8 for try... I'm pretty close to solve the problem when read the maps...
Logged
hajas
Member

Posts: 44



« Reply #44 on: June 21, 2007, 03:29:16 pm »

Ok, I done everything that I could to fix the siamese twins bug, and I FIXED!!!! Cheesy

but I'm having a little problem.... when I quit the server the game abort, or when I change the map for the 3rd time the game abort... I still don't know why... the string was altered with perfection, but seams that I miss something, maybe I need to use memcpy too?

well, here the final code:

I commented the file recording and the ARENA test to see the spawnpoints higher even in DM, and works really perfect! no one problem about that... attached you can find the files recorded to you see that manipulation was perfect!

Code:
static void CM_LoadEntityString (const byte *data, const lump_t *l){

char *game = Cvar_VariableString("fs_game"); // declare game - Hajas
//FILE *f;
char *p, *loc, *origem;
char *ptr = malloc(151);
int i, j, k, Tam, TamNew, ori;
int PA, PB, PC, PD, PL, Num, Space, Aspas;
char HStr[MAX_MAP_ENTSTRING], FinalStr[MAX_MAP_ENTSTRING];
char NewStr[150], PartA[150], PartB[150], PartC[20], PartD[150];

cm_numEntityChars = l->fileLen;
if (cm_numEntityChars < 1)
return;
if (cm_numEntityChars > MAX_MAP_ENTSTRING)
Com_Error(ERR_DROP, "CM_LoadMap: map '%s' has too large entity lump", cm_map);

cm_entityString = Hunk_Alloc(MAX_MAP_ENTSTRING);
memcpy(cm_entityString, data + l->fileOfs, cm_numEntityChars);

//f = fopen ("entityORI.cfg", "wb");
//fprintf(f, "%s\n", cm_entityString);
//fclose(f);

//if (!Q_stricmp(game, "arena")){
// do string manipulation over cm_entityString
strcpy(HStr, cm_entityString); // copy the original string to mine
        Tam = strlen(HStr);
        j=0;
       while (j < Tam){
   i=0;
           while ((HStr[j] != '}') && (j < Tam)){ // copy to NewStr each Class
               NewStr[i] = HStr[j];
               i++;j++;
           }
   if (HStr[j] == '}'){
NewStr[i] = HStr[j]; //add '}' close the class
NewStr[i+1] = '\0'; //add '\0' to the end of the class
   }
   TamNew = strlen(NewStr); //find the size of NewStr
   p = strstr(NewStr, "info_player");
           if (!p){ //test if is a spawn class
   strcat( FinalStr, NewStr ); //if not, save and go to the next class
           }else{
   i=0; //NewStr count to zero
               //if yes, start the hard work
   strcpy(ptr,NewStr);
   origem = strstr(ptr, "origin"); //find the origin position
   loc = origem-ptr;
   free(ptr);
               ori = loc + 8; // then add +8 (origin" ") to that position, which will reach the numbers of the axis
   free(loc);
   free(origem);
               // find PartA from 0 to L1 // until ori now
               for (PA=0;PA!=ori;PA++) //seta parte 1/4
               {
                    PartA[PA]=NewStr[PA];
   }
   PartA[PA]='\0'; //close string
               PL=PA; //create a new var to control the place in NewStr
               Space=0; //set to have zero spaces count
   PB=0; //zera PB
   // find PartB from start of numbers until 2nd space
   while (Space!=2)
               {
                    PartB[PB]=NewStr[PL];
if (PartB[PB]==' '){
Space++;
}
if(Space!=2){
PB++;PL++;
}
               }
   PartB[PB+1]='\0'; //close string
               Aspas=0; //set to plics to zero count
               // find PartC which is the Number, until reach next "
               for (PC=0;Aspas==0;PC++) //set part 3/4 = Num
               {
                   PL++;
   if (NewStr[PL]=='"')
                        Aspas = 1;
   else
                        PartC[PC]=NewStr[PL];
               }
   PartC[PC]='\0';
               // find PartD from " after number until the end of class
               for (PD=0;PL <= TamNew;PD++) //set part 4/4
               {
                   PartD[PD]=NewStr[PL];
                   PL++;
               }
               Num=atoi(PartC); // Convert to Number
               Num += 15; //add 15
               strcat( FinalStr, PartA ); // make all 4 parts into one
   strcat( FinalStr, PartB);
   sprintf(PartC,"%d",Num); // Num to String
   strcat( FinalStr, PartC);
           strcat( FinalStr, PartD );
           }
   for (k=0;k<=i;k++){ //clean NewStr
NewStr[k]='\0';
   }
   j++;
   }
  strcpy(cm_entityString, FinalStr);
/*f = fopen ("FinalStr.cfg", "wb");
fprintf(f, "%s\n", cm_entityString);
fclose(f);*/
free(p);
//}
}

with or without this line, we have the SAME behavior... abort when the third map is loaded.

Code:
strcpy(cm_entityString, FinalStr);


so isn't when the cm_entityString is altered... Sad

here the log file with developer 1

Code:
*** Log file opened on Thu Jun 21 15:23:04 2007 ***

Hunk_Clear: reset the hunk, ok
OS: Windows XP
RAM: 510 MB
Detecting CPU... Found Intel Pentium 4 2391 MHz w/ MMX SSE2
Winsock Initialized
NET_UDPSocket( localhost, 27910 )
HostName: E4203
IP: 10.10.4.203
======= Quake 2 Evolved Initialized =======
Execing dm.cfg
Cvar_Set2: timelimit "1"
SV_WipeSaveGame( current )
SV_GameMap( q2dm1 )
Cvar_Set2: sv_nextServer ""
------- Server Initialization -------
Server: q2dm1
Cvar_Set2: paused "0"
Hunk_Clear: reset the hunk, ok
----- FS_Startup -----
Current search path:
C:\q2/baseq2/q2e_pak0.pk2 (594 files)
C:\q2/baseq2/q2e_extras.pk2 (106 files)
C:\q2/baseq2/pak2.pak (2 files)
C:\q2/baseq2/pak1.pak (279 files)
C:\q2/baseq2/pak0.pak (1106 files)
C:\q2/baseq2

----------------------
2087 files in PAK/PK2 files
Cvar_Set2: deathmatch "1"
Cvar_Set2: maxclients "8"
Loading DLL file q2e_gamex86.dll...
-------- Game Initialization --------
gamename: baseq2
gamedate: Jun 21 2007
CM_LoadMap( maps/q2dm1.bsp, 0 )
Cvar_Set2: sv_gravity "800"
0 entities inhibited
0 teams with 0 entities
Cvar_Set2: needpass "0"
Cvar_Set2: sv_mapName "q2dm1"
Cvar_Set2: sv_mapChecksum "80717714"
-------------------------------------
Master server at 192.246.40.32:27900
Sending heartbeat to 192.246.40.32:27900...
]map q2dm2
SV_WipeSaveGame( current )
SV_GameMap( q2dm2 )
Cvar_Set2: sv_nextServer ""
------- Server Initialization -------
Server: q2dm2
Cvar_Set2: paused "0"
Hunk_Clear: reset the hunk, ok
------- Server Shutdown -------
Sending heartbeat to 192.246.40.32:27900...
==== ShutdownGame ====
Unloading DLL file 'q2e_gamex86.dll'...
-------------------------------
----- FS_Startup -----
Current search path:
C:\q2/baseq2/q2e_pak0.pk2 (594 files)
C:\q2/baseq2/q2e_extras.pk2 (106 files)
C:\q2/baseq2/pak2.pak (2 files)
C:\q2/baseq2/pak1.pak (279 files)
C:\q2/baseq2/pak0.pak (1106 files)
C:\q2/baseq2

----------------------
2087 files in PAK/PK2 files
Cvar_Set2: deathmatch "1"
Loading DLL file q2e_gamex86.dll...
-------- Game Initialization --------
gamename: baseq2
gamedate: Jun 21 2007
CM_LoadMap( maps/q2dm2.bsp, 0 )
Cvar_Set2: sv_gravity "800"
0 entities inhibited
1 teams with 2 entities
Cvar_Set2: needpass "0"
Cvar_Set2: sv_mapName "q2dm2"
Cvar_Set2: sv_mapChecksum "2935146665"
-------------------------------------
Sending heartbeat to 192.246.40.32:27900...
]map q2dm1
SV_WipeSaveGame( current )
SV_GameMap( q2dm1 )
Cvar_Set2: sv_nextServer ""
------- Server Initialization -------
Server: q2dm1
Cvar_Set2: paused "0"
Hunk_Clear: reset the hunk, ok
------- Server Shutdown -------
Sending heartbeat to 192.246.40.32:27900...
==== ShutdownGame ====
Unloading DLL file 'q2e_gamex86.dll'...
-------------------------------
----- FS_Startup -----
Current search path:
C:\q2/baseq2/q2e_pak0.pk2 (594 files)
C:\q2/baseq2/q2e_extras.pk2 (106 files)
C:\q2/baseq2/pak2.pak (2 files)
C:\q2/baseq2/pak1.pak (279 files)
C:\q2/baseq2/pak0.pak (1106 files)
C:\q2/baseq2

----------------------
2087 files in PAK/PK2 files
Cvar_Set2: deathmatch "1"
Loading DLL file q2e_gamex86.dll...
-------- Game Initialization --------
gamename: baseq2
gamedate: Jun 21 2007
CM_LoadMap( maps/q2dm1.bsp, 0 )


when we quit the server, the game freeze with this loq:

Code:
*** Log file opened on Thu Jun 21 15:33:13 2007 ***

Hunk_Clear: reset the hunk, ok
OS: Windows XP
RAM: 510 MB
Detecting CPU... Found Intel Pentium 4 2391 MHz w/ MMX SSE2
Winsock Initialized
NET_UDPSocket( localhost, 27910 )
HostName: E4203
IP: 10.10.4.203
======= Quake 2 Evolved Initialized =======
Execing dm.cfg
Cvar_Set2: timelimit "1"
SV_WipeSaveGame( current )
SV_GameMap( q2dm1 )
Cvar_Set2: sv_nextServer ""
------- Server Initialization -------
Server: q2dm1
Cvar_Set2: paused "0"
Hunk_Clear: reset the hunk, ok
----- FS_Startup -----
Current search path:
C:\q2/baseq2/q2e_pak0.pk2 (594 files)
C:\q2/baseq2/q2e_extras.pk2 (106 files)
C:\q2/baseq2/pak2.pak (2 files)
C:\q2/baseq2/pak1.pak (279 files)
C:\q2/baseq2/pak0.pak (1106 files)
C:\q2/baseq2

----------------------
2087 files in PAK/PK2 files
Cvar_Set2: deathmatch "1"
Cvar_Set2: maxclients "8"
Loading DLL file q2e_gamex86.dll...
-------- Game Initialization --------
gamename: baseq2
gamedate: Jun 21 2007
CM_LoadMap( maps/q2dm1.bsp, 0 )
Cvar_Set2: sv_gravity "800"
0 entities inhibited
0 teams with 0 entities
Cvar_Set2: needpass "0"
Cvar_Set2: sv_mapName "q2dm1"
Cvar_Set2: sv_mapChecksum "80717714"
-------------------------------------
Master server at 192.246.40.32:27900
Sending heartbeat to 192.246.40.32:27900...
]quit
------- Server Shutdown -------
Sending heartbeat to 192.246.40.32:27900...
==== ShutdownGame ====
Unloading DLL file 'q2e_gamex86.dll'...
-------------------------------


attached are the strings (original and altered ones)... you will see that are the same, aside the altered (FinalStr) have more 15 added to his origin.Z, are the only difference between them...

and in game works very well!

now I need a little more help from you to finish this hard task! Wink

thanks a lot! Cheesy

* entityORI.txt (12.62 KB - downloaded 271 times.)
* FinalStr.txt (12.62 KB - downloaded 249 times.)
Logged
Pages: 1 2 [3]  All
Print
r1ch.net  |  General  |  General Discussion  |  Topic: Trying to fix the Siamese Twins problem...
Jump to:  

Powered by SMF 1.1.19 | SMF © 2013, Simple Machines