Which Mod Looks The Best?

Caliber
Urban Terror
Survival 9mm
Weapons Factory
None of the above


News

- Current
- Archived
- Send News
Tutorials
- Coding
- Mapping
Interviews
- Caliber Mod
Mods
- Previews
:::Q3Fortress
- Reviews
Download
- Best Maps
- Best Models
- Tools
Community
- Forums
- Dev Screens
- Chat

Mod Database
- Sign-Up
- Add Mod
- Delete Mod
- View Mods
Hosted Sites
Mods

- Alien Culture
- Alive

- Anarchy
- Armed Service
- Battle Arena
- Caliber
- Chaotic Designs
- Classic Q3A
- Countdown to Dest.
- Critical Mass
- Crusade
- Darkgift
- DarkStar
- Decimal
- Defend The Flags
- Full Metal Jacket
- Front Lines
- Fury
- GatheringDarkness
- Guerilla Warfare
- Hunter
- Insanity
- Insanity Prod.
- Jagged Q3
- Nightrunner
- Occupation
- Oblivion Demise
- Omega
- QForces
- Railfest
- Resound
- Run Bob Run
- ShadowRun
- ShadowStar Conflict
- SiR
- Snipers
- Team Phatass
- Terrorism
- Toons of Evil
- Tritium
- Urban Terror
- Zoners

Editing
- Coded
- Rungy's Metropolis
- MD3Centre
- PikaMaps!
- Q3Empire
- RealGunz
- RocIDE
- Team Interact

 
 


Reading from External Files - By Ad0

Well, I had a goal today! I wanted to read a file, and then, Print the content of the file to the console. I made it, with a bit help from AnthonyJ. He made me look closer and correct my stupidious little bug that I should have corrected myself, so a BIG thanks to him!

I am still sticking me to the server-side, also Game. And I will still work in g_cmds.c. So open that file, and find an open space for coding.

The Function we are going to create is a function that reads the file from an argument of our function, and puts the content on the console.
Create a function, named "Cmd_ReadFile_f". The function would look like this. Do not just paste this and pretend like you understand all this - Read, Understand, Learn, and then write it off, and even better: in your own, personal way:

void Cmd_ReadFile_f( gentity_t *ent) {

}

When we write our function, we want to have some declarations first, and the first declaration would be the dec. of the filename:

char filename[MAX_STRING_TOKENS]; //max chars for strings

Now we have fixed the filename declaration. You could change "filename" to if you want, but just remember to follow it down the function.
When I looked a the read code, I saw that you had to include the handle of the file. It's a definition. And now, let's define it to, let's say: "t". The "alias would look like this:

fileHandle_t f;

And now, we have to add a declaration for our text buffer (the content of the text stored in temp memory):

char buffer[MAX_ARENAS_TEXT]; //max text

And now, our last definition: The length if the text (in letters) the buffer is. This is for checkingif the file contains anything, and so on:

int length; //The int for length of buffer

The first thing to do now, is to catch the argument from the console. This is also shown in my Command Argument tutorial. Look here, and learn:

trap_Argv( 1, filename, sizeof( filename ) ); //Catches the command argument

Look at this. Now it catches the file name.
Now, let's add a check if you have typed any argument plus an error message in red colour. I also have a tutorial containing use of colours:

if ( !Q_stricmp( filename, "" ) ) //Triggers the function under if no arguent entered
trap_SendServerCommand( ent-g_entities, va("print \""S_COLOR_RED"No file name entered!\n\""));

Done! Now, let's check the length of the file:

length = trap_FS_FOpenFile( filename, &f, FS_READ ); //Checks the file length

Logic, isn't it?
And for not mixing file lengths, I added a statement that cleared the buffer count:

buffer[length] = 0;

And now we could add two ways of checking if it's the right file, or if the file is empty in two ways. I just show you the code. The rest is up to you. I am trying to learn as best as I can:

if ( !length) { //If NOT any length
trap_SendServerCommand( ent-g_entities, va("print \"I could not open your file: %s\n\"",filename));
return;
}

if (length < 0) { //If Length less than zero
trap_SendServerCommand( ent-g_entities, va("print \"I could not open your file: %s\n\"",filename));
return;
}

Now we got the check done. As a limiter for larger files, we can add a code for controlling the buffer. Thanks, AnthonyJ!:

if (length >= MAX_ARENAS_TEXT) //Checks if length of file s bigger than limit length = MAX_ARENAS_TEXT-1; //Cuts all text after 1 letter minus

I explored how the file reading function worked by looking in the Quake 3: Arena source, and I found out that I had to add this code for making it Read and close the current file:

trap_FS_Read(buffer,length,f); //Reads the file into the buffer trap_SendServerCommand( ent-g_entities, va("print \"Here Goes:\n %s \n\"", buffer)); //Prints the buffer to client

trap_FS_FCloseFile( f ); //Closes the buffer

%s Prints the buffer. %s get's the prameter at the end: buffer. See?

The only thing that remains, is to add this as a command in the command list. Scroll down till you find that list of commands they all look like my code I am foing to show.I show this for reference:

else if (Q_stricmp (cmd, "read") == 0)

Cmd_ReadFile_f( ent );

And this adds the command (for those who didn't know that).

I will add a tutorial of controlling File Input, like read parts of the text in chunks and print them out (so the buffer donesn't need to be big).

And remember: Quake doesn't allow to read files that exists in other places than in, and under your mod directory you are putting the compiled result in. q3key won't get read, beacause Mr. Carmack didn't want it to. So don't try anything smart.

I hope you understood this, I really, really do! Just send questions to my mail address above.

For my music, go here!

Cheers!