Difference between revisions of "Writing Advanced Modules In C"
From ASSS Wiki
m (→Passing Data To Timers: let's not have memory leaks in sample code) |
m (→Passing Multiple Arguments To Commands: fixed a bug, a memory leak, and made it cross platform) |
||
Line 55: | Line 55: | ||
<pre> | <pre> | ||
+ | // define macros for comparing strings that work for both linux and windows | ||
+ | #ifdef WIN32 | ||
+ | #define STRCASECMP stricmp | ||
+ | #define STRNCASECMP strnicmp | ||
+ | #else | ||
+ | #define STRCASECMP strcasecmp | ||
+ | #define STRNCASECMP strncasecmp | ||
+ | #endif | ||
+ | |||
local void examplecommand(const char *command, const char *params, Player *p, const Target *t) | local void examplecommand(const char *command, const char *params, Player *p, const Target *t) | ||
{ | { | ||
char *sentence=strdup(params); //strdup clones a string because strtok replaces " " with a \0 | char *sentence=strdup(params); //strdup clones a string because strtok replaces " " with a \0 | ||
− | char *word=strtok( | + | char *word=strtok(sentence," "); //strtok reads everything until first \0 into word |
while(word) //while word != null | while(word) //while word != null | ||
{ | { | ||
− | if(! | + | if(!STRNCASECMP(word,"a=",2)) //STRNCASECMP is a case insensitive comparison that returns 0 if the same, with a number |
{ | { | ||
//do stuff if first 2 letters of word are 'a' then '=' | //do stuff if first 2 letters of word are 'a' then '=' | ||
Line 69: | Line 78: | ||
int check=atoi(word); //then read a number | int check=atoi(word); //then read a number | ||
} | } | ||
− | else if(! | + | else if(!STRNCASECMP(word,"bc=",3)) |
{ | { | ||
//do stuff if first 3 letters of word are 'b' then 'c' then '=' | //do stuff if first 3 letters of word are 'b' then 'c' then '=' | ||
Line 76: | Line 85: | ||
int check=atoi(word); //then read a number | int check=atoi(word); //then read a number | ||
} | } | ||
− | else if(! | + | else if(!STRCASECMP(word,"-de")) //thats STRCASECMPwith no N, it checks the whole thing |
{ | { | ||
//do stuff if word is "-de" | //do stuff if word is "-de" | ||
Line 82: | Line 91: | ||
word=strtok(NULL," "); //advance to next word, or set word to null if none left | word=strtok(NULL," "); //advance to next word, or set word to null if none left | ||
} | } | ||
+ | |||
+ | afree(sentence); // since we allocated a string with strdup, we must free the associated memory manually | ||
} | } | ||
</pre> | </pre> | ||
− | |||
== Creating Callbacks == | == Creating Callbacks == |
Revision as of 16:33, 29 December 2010
This tutorial explains how to write advanced modules in C. It is assumed you know how to code and are familiar with how the ASSS code works.
This tutorial is a continuation of Writing Modules In C.
Some useful references:
http://qnxcs.unomaha.edu/help/product/neutrino/lib_ref/summary.html
http://www.cplusplus.com/reference/
Contents
Passing Data To Timers
typedef struct ThisIsData { Player *p; int number; } ThisIsData; local int timerfunc(void *vp) //vp is void pointer, just an address that can point anywhere { ThisIsData *tid=(ThisIsData*)vp; //we know it points to our data if(tid->number == 10) { //if it worked anything in here will work too } //return 1 if you want timer to run again, or 0 if you want it to be removed int returnValue = 0; if (returnValue == 0) afree(tid); // free the data we have previously allocated return returnValue; } anotherfunction() { ThisIsData *tid=amalloc(sizeof(ThisIsData)); //we must allocate memory because anything in this function is destroyed when it ends tid->number=10 //now set timer to activate in 1000 centiseconds, then repeat every 100. //we are also sending the address of the memory we just allocated. ml->SetTimer(timerfunc,1000,100,tid,0); }
Passing Multiple Arguments To Commands
Since the words are read one by one, then checked against the whole list, they can be in any order!
// define macros for comparing strings that work for both linux and windows #ifdef WIN32 #define STRCASECMP stricmp #define STRNCASECMP strnicmp #else #define STRCASECMP strcasecmp #define STRNCASECMP strncasecmp #endif local void examplecommand(const char *command, const char *params, Player *p, const Target *t) { char *sentence=strdup(params); //strdup clones a string because strtok replaces " " with a \0 char *word=strtok(sentence," "); //strtok reads everything until first \0 into word while(word) //while word != null { if(!STRNCASECMP(word,"a=",2)) //STRNCASECMP is a case insensitive comparison that returns 0 if the same, with a number { //do stuff if first 2 letters of word are 'a' then '=' word+=2; //like move start of word 2 letters forward int check=atoi(word); //then read a number } else if(!STRNCASECMP(word,"bc=",3)) { //do stuff if first 3 letters of word are 'b' then 'c' then '=' word+=3; //make sure you move it 3 letters and not 2 int check=atoi(word); //then read a number } else if(!STRCASECMP(word,"-de")) //thats STRCASECMPwith no N, it checks the whole thing { //do stuff if word is "-de" } word=strtok(NULL," "); //advance to next word, or set word to null if none left } afree(sentence); // since we allocated a string with strdup, we must free the associated memory manually }
Creating Callbacks
Write me!
//example code goes here
Creating Interfaces
Cover overwriting existing interfaces to replace old modules. Write me!
//example code goes here
Sending Packets To Players
Cover position packets, weapon packets, clientset stuff, etc. Write me!
//example code goes here
Using Advisors
Write me!
//example code goes here
Creating Advisors
Write me!
//example code goes here