#pragma pack(1) //fixes tile problem in MSVC++ (maybe others) #define VER " 0.69.02 (Release)" //#define VER "0.69.02 (Test Build 03)" //Increment to 01 when putting out official test build #define PRODUCT "Ultima Offline eXperiment 3" // Your timezone #define TIMEZONE "GMT-8" // Information about the person who compiled this (Put your info here!) #define NAME "UOX3 FreeBSD Port User" #define EMAIL "ports@FreeBSD.ORG" #ifdef _WIN32 #define __NT__ #define _MSVC #endif #ifdef __NT__ #ifndef _WIN32 #define _WIN32 #endif #endif #if (defined _WIN32 && (!__MINGW32__)) || defined(__FreeBSD__) #define PACK_NEEDED #else #define PACK_NEEDED __attribute__ ((packed)) #endif // Include files #include #include #include #include #include #ifdef __NT__ #include #include #include #include #include #include #include #include #else #include #ifdef __FreeBSD__ #include #include #endif // __FreeBSD__ #include #include #include #include #include #include #include #include #endif #include "im.h" #include "uoxlist.h" #include "scriptc.h" #include "worldmain.h" // LINUX Definitions #ifndef __NT__ #define max(a,b) ((a) >= (b) ? (a) : (b)) #define min(a,b) ((a) <= (b) ? (a) : (b)) char *strlwr(char *); char *strupr(char *); #endif #define CLIENTVERSION 36 // - Beosil #if CLIENTVERSION == 36 #define MASTERKEY1 0x387fc5cc #define MASTERKEY2 0x35ce9581 #define MASTERKEY3 0x07afcc37 #define MASTERKEY4 0x021510c6 #define MASTERKEY5 0x4c3a1353 #define MASTERKEY6 0x16ef783f #endif #if CLIENTVERSION == 35 #define MASTERKEY1 0x383477BC #define MASTERKEY2 0x02345CC6 #endif #if CLIENTVERSION == 34 #define MASTERKEY1 0x38ECEDAC #define MASTERKEY2 0x025720C6 #endif #if CLIENTVERSION == 33 #define MASTERKEY1 0x38A5679C #define MASTERKEY2 0x02767CC6 #endif #if CLIENTVERSION == 32 #define MASTERKEY1 0x389DE58C #define MASTERKEY2 0x026950C6 #endif #if CLIENTVERSION == 31 #define MASTERKEY1 0x395A647C #define MASTERKEY2 0x0297BCC6 #endif #define MAXIMUM 128 // Maximum open connections to server #define MAXCLIENT MAXIMUM+1 #define MAXACCT 1024 // Maximum accounts #define MAXSERV 32 // Maximum servers in login listing #define MAXSTART 64 // Maximum starting locations #define MAXBUFFER 2560 // Buffer Size (For socket operations) #define MAXPAGES 100 // Maximum number of pages in the GM queue #define VISRANGE 18 // Visibility for normal items #define BUILDRANGE 31 // Visibility for castles and keeps #define MAXCHARS (MAXACCT*5)+300 // Maximum characters //#define MAXITEMS 16384 // Maximum items #define MAXITEMS 65535 // Maximum items #define XYMAX 256 // Maximum items UOX can handle on one X/Y square #define MAXEFFECTS 5*MAXCHARS #define MAXLAYERS 50 // Maximum number of Layers in paperdolls (still not sure how many) #define ITEMMENUOFFSET 256 #define CMAX 40 // Maximum parameters in one line (Only for memory reasons) #define VERFILE_MAP 0x00 #define VERFILE_STAIDX 0x01 #define VERFILE_STATICS 0x02 #define VERFILE_ARTIDX 0x03 #define VERFILE_ART 0x04 #define VERFILE_ANIMIDX 0x05 #define VERFILE_ANIM 0x06 #define VERFILE_SOUNDIDX 0x07 #define VERFILE_SOUND 0x08 #define VERFILE_TEXIDX 0x09 #define VERFILE_TEXMAPS 0x0A #define VERFILE_GUMPIDX 0x0B #define VERFILE_GUMPART 0x0C #define VERFILE_MULTIIDX 0x0D #define VERFILE_MULTI 0x0E #define VERFILE_SKILLSIDX 0x0F #define VERFILE_SKILLS 0x10 #define VERFILE_TILEDATA 0x1E #define VERFILE_ANIMDATA 0x1F #define TILEDATA_TILES 0x68800 #define UOX_PORT 2593 #define GOLD_WEIGHT 0.02 //what a goldpiece weighs #define REGENRATE1 8 // Seconds to heal ONE hp #define REGENRATE2 3 // Seconds to heal ONE stm #define REGENRATE3 5 // Seconds to heal ONE mn #define SPIRITSPEAKTIMER 30 // spiritspeak lasts at least 30 seconds, additional time is calculated by Skill & INT ////////////////// /* RELEASED/UNRELEASED <-- Is program a release version? (To remove some debug features) DEBUG/NODEBUG <-- Debug: Shows client->server messages in the server window SPECIAL/NOSPECIAL <-- Special: Give characters a random mask in their starting equipment SINGLEONLY/NOSINGLEONLY <-- Singleonly: For pre-release testers (Version without multiplayer) LSERVCHECK/NOLSERVCHECK <-- Nolservcheck: Disable account verification for local testing LOGALL/NOLOGALL <-- LOGALL: Bugs hunting routines are turned on. Slower execution when compiled. Turn it off when releasing. */ #define RELEASED #define NODEBUG #define NOSPECIAL #define NOSINGLEONLY #define NOLSERVCHECK #define CRYPT #define NOLOGALL ////////////////// // List of monster sounds #define SND_STARTATTACK 0 #define SND_IDLE 1 #define SND_ATTACK 2 #define SND_DEFEND 3 #define SND_DIE 4 // List of skill numbers (For later implementation) #define ALCHEMY 0 #define ANATOMY 1 #define ANIMALLORE 2 #define ITEMID 3 #define ARMSLORE 4 #define PARRYING 5 #define BEGGING 6 #define BLACKSMITHING 7 #define BOWCRAFT 8 #define PEACEMAKING 9 #define CAMPING 10 #define CARPENTRY 11 #define CARTOGRAPHY 12 #define COOKING 13 #define DETECTINGHIDDEN 14 #define ENTICEMENT 15 #define EVALUATINGINTEL 16 #define HEALING 17 #define FISHING 18 #define FORENSICS 19 #define HERDING 20 #define HIDING 21 #define PROVOCATION 22 #define INSCRIPTION 23 #define LOCKPICKING 24 #define MAGERY 25 #define MAGICRESISTANCE 26 #define TACTICS 27 #define SNOOPING 28 #define MUSICIANSHIP 29 #define POISONING 30 #define ARCHERY 31 #define SPIRITSPEAK 32 #define STEALING 33 #define TAILORING 34 #define TAMING 35 #define TASTEID 36 #define TINKERING 37 #define TRACKING 38 #define VETERINARY 39 #define SWORDSMANSHIP 40 #define MACEFIGHTING 41 #define FENCING 42 #define WRESTLING 43 #define LUMBERJACKING 44 #define MINING 45 #define ALLSKILLS 46 #define STR 47 #define DEX 48 #define INT 49 #define FAME 50 #define KARMA 51 #define DOORTYPES 17 #define WEIGHT_PER_STR 4 #define SKILLS 52 #define TRUESKILLS 46 #define MAXGATES 100 #define GATETIMER 30 #define MINECHECK 2 #define DECAYTIMER 300 // 5 minute decay rate #define INVISTIMER 60 // invisibility spell lasts 1 minute #define HUNGERRATE 6000 // 15 minutes #define NPCSPEED .5 // 2 steps every second #define SKILLDELAY 5 // Skill usage delay (5 seconds) #define OBJECTDELAY 1 #define SHOWDEATHANIM 1 #define COMBATHITMESSAGE 1 #define MONSTERS_VS_ANIMALS 0 // By default monsters won't attack animals #define ANIMALS_ATTACK_CHANCE 15 // By default 15% of chance to attack an animal #define ANIMALS_GUARDED 0 // By default players can attack animals without summoning guards #define NPC_BASE_FLEEAT 20 #define NPC_BASE_REATTACKAT 40 #define STABLOCKCACHESIZE 1000 #define MAKEMENUOFFSET 2048 #define TRACKINGMENUOFFSET 4096 // menu offset #define TRACKINGRANGE 10 // tracking range is at least TRACKINGRANGE, additional distance is calculated by Skill,INT #define MAXTRACKINGTARGETS 20 // maximum number of trackable targets #define TRACKINGTIMER 30 // tracking last at least TRACKINGTIMER seconds, additional time is calculated by Skill,INT, & DEX #define TRACKINGDISPLAYTIME 30 // tracking will display above the character every TRACKINGDISPLAYTIME seconds #define NORTH 1 #define NORTHWEST 2 #define NORTHEAST 3 #define SOUTH 4 #define SOUTHWEST 5 #define SOUTHEAST 6 #define WEST 7 #define EAST 8 #define BEGGINGRANGE 3 // begging range #define FISHINGTIMEBASE 10 // it takes at least FISHINGTIMEBASE sec to fish #define FISHINGTIMER 5 // for spinning wheel -vagrant #define YARN 0 #define THREAD 1 // Structure Definitions #define MAX_TELE_LOCATIONS 400 // Dupois - for fileArchive() // Added Oct 20, 1998 #define MAXARCHID 14 // Line Of Sight #define ITEM_TYPE_CHOICES 6 #define TREES_BUSHES 1 // Trees and other large vegetaion in the way #define WALLS_CHIMNEYS 2 // Walls, chimineys, ovens, etc... in the way #define DOORS 4 // Doors in the way #define ROOFING_SLANTED 8 // So can't tele onto slanted roofs, basically #define FLOORS_FLAT_ROOFING 16 // For attacking between floors #define LAVA_WATER 32 // Don't know what all to use this for yet /////////////////////// End Defines struct charitems_st // Pointer array to character's items { int count; int items[1024]; }; struct char_st { char ser1; // Character serial number char ser2; char ser3; char ser4; int serial; char free; char name[50]; char title[50]; char unicode; // This is set to 1 if the player uses unicode speech, 0 if not unsigned int account; int x; int y; int z; unsigned int dispz; // Z that the char is SHOWN at. Server needs other coordinates for real movement calculations. unsigned int oldx; // fix for jail bug unsigned int oldy; // fix for jail bug unsigned int oldz; // fix for jail bug char dir; char id1; // Character body type char id2; char xid1; // Backup of body type for ghosts char xid2; char skin1; // Skin color char skin2; char xskin1; // Backup of skin color char xskin2; char priv; // 1:GM clearance, 2:Broadcast, 4:Invulnerable, 8: single click serial numbers // 10: Don't show skill titles, 20: GM Pagable, 40: Can snoop others packs, 80: Counselor clearance char priv2; // 1:Allmove, 2: Frozen, 4: View houses as icons, 8: permanently hidden // 10: no need mana, 20: dispellable, 40: permanent magic reflect, 80: no need reagents char fonttype; // Speech font to use char saycolor1; // Color for say messages char saycolor2; char emotecolor1; // Color for emote messages char emotecolor2; int st; // Strength int st2; // Reserved for str-advancement calculation int dx; // Dexterity int dx2; int in; // Intelligence int in2; int hp; // Hitpoints int stm; // Stamina int mn; // Mana int mn2; int hidamage; int lodamage; unsigned short int baseskill[46]; // Base skills without stat modifiers unsigned short int skill[46]; // List of skills (with stat modifiers) char npc; // 1=Character is an NPC char shop; //1=npc shopkeeper char cell; // Reserved for jailing players char own1; // If Char is an NPC, this sets its owner char own2; char own3; char own4; int ownserial; char robe1; // Serial number of generated death robe (If char is a ghost) char robe2; char robe3; char robe4; int karma; signed int fame; unsigned int kills; unsigned int deaths; char dead; // Is character dead unsigned int packitem; // Only used during character creation char fixedlight; // Fixed lighting level (For chars in dungeons, where they dont see the night) char speech; // For NPCs: Number of the assigned speech block float weight; unsigned int att; // Intrinsic attack (For monsters that cant carry weapons) unsigned int def; // Intrinsic defense char war; // War Mode int targ; // Current combat target unsigned int timeout; // Combat timeout (For hitting) unsigned long int regen, regen2, regen3; int runenumb; // Used for naming runes int attacker; // Character who attacked this character unsigned long int npcmovetime; // Next time npc will walk char npcWander; // NPC Wander Mode char oldnpcWander; int ftarg; // NPC Follow Target int fx1; //NPC Wander Point 1 x int fx2; //NPC Wander Point 2 x int fy1; //NPC Wander Point 1 y int fy2; //NPC Wander Point 2 y int fz1; //NPC Wander Point 1 z char spawn1; // Spawned by char spawn2; // Spawned by char spawn3; // Spawned by char spawn4; // Spawned by int spawnserial; char hidden; // 0 = not hidden, 1 = hidden, 2 = invisible spell unsigned int invistimeout; char attackfirst; // 0 = defending, 1 = attacked first char onhorse; // On a horse? int hunger; // Level of hungerness, 6 = full, 0 = "empty" int hungertime; // Timer used for hunger, one point is dropped every 20 min int smeltitem; int tailitem; char npcaitype; int callnum; //GM Paging int playercallnum; //GM Paging int pagegm; //GM Paging char region; unsigned int skilldelay; int objectdelay; int combathitmessage; int making; // skill number of skill using to make item, 0 if not making anything. char blocked; char dir2; unsigned int spiritspeaktimer; // Timer used for duration of spirit speak int spattack; int spadelay; unsigned int spatimer; int taming; //Skill level required for taming int summontimer; //Timer for summoned creatures. unsigned int trackingtimer; // Timer used for the duration of tracking unsigned int trackingtarget; // Tracking target ID unsigned int trackingtargets[MAXTRACKINGTARGETS]; unsigned int fishingtimer; // Timer used to delay the catching of fish int town; //Matches Region number in regions.scp char townvote1; //Serial Number of who they want to be mayor. char townvote2; char townvote3; char townvote4; int towntitle; //0=off (default), 1=on. (i.e. - The Honorable Joe of Moonglow, Expert Swordsman) char townpriv; //0=non resident (Other privledges added as more functionality added) int advobj; int poison; int poisoned; int poisontime; int poisontxt; int fleeat; int reattackat; int trigger; //Trigger number that character activates char trigword[31]; //Word that character triggers on. unsigned int disabled; //Character is disabled, cant trigger. char envokeid1; //ID1 of item user envoked char envokeid2; //ID2 of item user envoked int envokeitem; int split; int splitchnc; int targtrig; //Stores the number of the trigger the character for targeting char ra; // Reactive Armor spell int trainer; // Serial of the NPC training the char, -1 if none. char trainingplayerin; // Index in skillname of the skill the NPC is training the player in char cantrain; }; struct item_st { char ser1; // Item serial number char ser2; char ser3; char ser4; int serial; char free; char id1; // Item visuals as stored in the client char id2; char name[50]; char name2[50]; int x; int y; int z; char color1; // Hue char color2; char cont1; // Container that this item is found in char cont2; char cont3; char cont4; int contserial; char layer; // Layer if equipped on paperdoll unsigned int type; // For things that do special things on doubleclicking unsigned int type2; char offspell; float weight; char more1; // For various stuff char more2; char more3; char more4; char moreb1; char moreb2; char moreb3; char moreb4; unsigned int morex; unsigned int morey; unsigned int morez; unsigned int amount; // Amount of items in pile unsigned int amount2; //Used to track things like number of yards left in a roll of cloth char doordir; // Reserved for doors char dooropen; char pileable; // Can item be piled char dye; // Reserved: Can item be dyed by dye kit char corpse; // Is item a corpse unsigned int att; // Item attack unsigned int def; // Item defense int lodamage; //Minimum Damage weapon inflicts int hidamage; //Maximum damage weapon inflicts int wpsk; //The skill needed to use the item int hp; //Number of hit points an item has. int maxhp; // Max number of hit points an item can have. int st; // The strength needed to equip the item int st2; // The strength the item gives int dx; // The dexterity needed to equip the item int dx2; // The dexterity the item gives int in; // The intelligence needed to equip the item int in2; // The intelligence the item gives int spd; //The speed of the weapon int wipe; //Should this item be wiped with the /wipe command char magic; // 0=Default as stored in client, 1=Always movable, 2=Never movable, 3=Owner movable. unsigned int gatetime; int gatenumber; int decaytime; char owner1; char owner2; char owner3; char owner4; int ownserial; char visible; // 0=Normally Visible, 1=Owner & GM Visible, 2=GM Visible char spawn1; // Spawned by... char spawn2; char spawn3; char spawn4; int spawnserial; char dir; // Direction, or light source type. char priv; // Bit 0, decay off/on. Bit 1, newbie item off/on. Bit 2 Dispellable int value; // Price shopkeeper sells item at. int restock; // Number up to which shopkeeper should restock this item int trigger; //Trigger number that item activates int trigtype; //Type of trigger unsigned int disabled; //Item is disabled, cant trigger. int tuses; //Number of uses for trigger }; struct lookuptr_st //Tauriel used to create pointers to the items dynamically allocated { // so don't mess with it unless you know what you are doing! int max; int *pointer; }; struct tile_st { char flag1; char flag2; char flag3; char flag4; char weight; char layer; long int unknown1; long int animation; char unknown2; char unknown3; char height; char name[20]; } PACK_NEEDED; struct land_st { char flag1; char flag2; char flag3; char flag4; char unknown1; char unknown2; char name[20]; }; struct versionrecord { long int file; long int block; long int filepos; long int length; long int unknown; } PACK_NEEDED; struct staticrecord { short int itemid; char xoff; char yoff; char zoff; short int extra; // Unknown yet } PACK_NEEDED; // XYZZY struct unitile_st { signed char basez; char type; // 0=Terrain, 1=Item unsigned short int id; char flag1; char flag2; char flag3; char flag4; signed char height; unsigned char weight; } PACK_NEEDED; struct st_multiidx { long int start; long int length; long int unknown; } PACK_NEEDED; struct st_multi { short int tile; signed short int x; signed short int y; signed short int z; long int visible; } PACK_NEEDED; struct teffect_st { char sour1; char sour2; char sour3; char sour4; char dest1; char dest2; char dest3; char dest4; int expiretime; char num; char more1; char more2; char more3; char dispellable; int itemptr; } PACK_NEEDED; struct location_st { int x1; int y1; int x2; int y2; char region; }; struct region_st { char name[50]; int midilist; char priv; // 0x01 guarded, 0x02, mark allowed, 0x04, gate allowed, 0x08, recall // 0x10 raining, 0x20, snowing, 0x40 magic damage reduced to 0 char guardowner[50]; char snowchance; char rainchance; int guardnum[10]; }; struct skill_st { int st; int dx; int in; int advance_index; }; struct advance_st { char skill; int base; int success; int failure; }; struct make_st { int has; int has2; int needs; int minskill; int maxskill; char materialid1; // id1 of material used to make item char materialid2; // id2 of material used to make item (vagrant) char materialid1b; // id1 of second material used to make item (vagrant) char materialid2b; // id2 of second material used to make item (vagrant) }; struct gmpage_st { char reason[80]; int ser1; int ser2; int ser3; int ser4; char timeofcall[9]; char name[20]; int handled; } PACK_NEEDED; struct jail_st { unsigned int oldx; unsigned int oldy; unsigned int oldz; unsigned int x; unsigned int y; unsigned int z; unsigned int occupied; } PACK_NEEDED; struct tracking_st { unsigned int baserange; unsigned int maxtargets; unsigned int basetimer; unsigned int redisplaytime; }; struct begging_st { unsigned int range; char text[3][256]; }; struct fishing_st { unsigned int basetime; unsigned int randomtime; }; struct spiritspeak_st { unsigned int spiritspeaktimer; }; struct server_st { unsigned int joinmsg; unsigned int partmsg; unsigned int decaytimer; unsigned int invisibiliytimer; unsigned int hungerrate; unsigned int skilldelay; unsigned int objectdelay; unsigned int hitpointrate; unsigned int staminarate; unsigned int manarate; unsigned int gatetimer; unsigned int minecheck; unsigned int showdeathanim; unsigned int combathitmessage; unsigned int monsters_vs_animals; unsigned int animals_attack_chance; unsigned int animals_guarded; unsigned int npc_base_fleeat; unsigned int npc_base_reattackat; unsigned char guardsactive; unsigned char bg_sounds; char archivepath[256]; unsigned char UOXBot; unsigned char hungerdamage; unsigned int hungerdamagerate; char armoraffectmana; // Should armor slow mana regen ? // EviLDeD - Added server save support for this // December 27, 1998 char announceworldsaves; // EviLDeD - End unsigned int log; unsigned int rogue; }; struct title_st // For custom titles { char fame[50]; char skill[50]; char prowess[50]; }; // Global Variables extern unsigned short int doorbase[DOORTYPES]; extern char skillname[52][20]; extern char spellname[71][25]; extern char login04a[6]; extern char login04b[61]; extern char login04c[18]; extern char login04d[64]; extern char login03[12]; extern char noaccount[3]; extern char nopass[3]; extern char acctblock[3]; extern char xpause[3]; extern char restart[3]; extern char goxyz[20]; extern char wearitem[16]; extern char talk[15]; extern char sysname[31]; extern char removeitem[6]; extern char gmprefix[10]; extern char gmmiddle[5]; extern unsigned char sfx[13]; extern char doact[15]; extern char bpitem[20]; extern char gump1[22]; extern char gump2[4]; extern char gump3[3]; extern char dyevat[10]; extern char updscroll[11]; extern char spc[2]; extern char bounce[3]; extern char extmove[18]; #ifdef __NT__ extern WSADATA wsaData; extern WORD wVersionRequested; #endif extern int gatex[MAXGATES][2],gatey[MAXGATES][2],gatez[MAXGATES][2]; extern int gatecount; //Time variables extern int day, hour, minute, ampm; //Initial time is noon. extern int secondsperuominute; //Number of seconds for a UOX minute. extern int uotickcount; extern int moon1update; extern int moon2update; extern int hbu; // heartbeat update var extern char moon1; extern char moon2; extern char dungeonlightlevel; extern char worldfixedlevel; extern char worldcurlevel; extern char worldbrightlevel; extern char worlddarklevel; extern int goldamount; extern char goldamountstr[10]; extern char defaultpriv1str[2]; extern char defaultpriv2str[2]; extern int defaultpriv1; extern int defaultpriv2; extern unsigned int teffectcount; // No temp effects to start with extern unsigned int nextfieldeffecttime; extern unsigned int nextnpcaitime; extern unsigned int nextdecaytime; extern short int max_tele_locations; extern short int tele_locations[MAX_TELE_LOCATIONS][6]; // MSVC fails to compile UOX if this is unsigned, change it then #ifdef _MSVC extern long int oldtime, newtime; #else extern time_t oldtime, newtime; //for autosaving #endif extern int autosaved, saveinterval, heartbeat; extern char saveintervalstr[4]; extern int len_connection_addr; extern struct sockaddr_in connection; extern struct sockaddr_in client_addr; extern struct hostent *he; extern char hname[40]; extern int err, error; extern int keeprun; extern int a_socket; extern int client[MAXCLIENT]; extern int server[MAXCLIENT]; extern struct fd_set conn; extern struct fd_set all; extern struct fd_set errsock; extern int nfds; extern timeval uoxtimeout; extern unsigned int now; extern int newclient[MAXCLIENT]; extern char buffer[MAXCLIENT][MAXBUFFER]; extern char outbuffer[MAXCLIENT][MAXBUFFER]; extern char tbuffer[MAXBUFFER]; extern short int walksequence[MAXCLIENT]; extern int recvcount; extern char temp[1024]; extern char mapname[512], sidxname[512], statname[512], vername[512], tilename[512], multiname[512], midxname[512]; extern FILE *infile, *scpfile, *lstfile, *wscfile, *mapfile, *sidxfile, *statfile, *verfile, *tilefile, *multifile, *midxfile; extern unsigned int acctcount; extern unsigned int servcount; extern unsigned int startcount; extern char xacct[MAXACCT][3][31]; // Account list extern char acctinuse[MAXACCT]; extern char serv[MAXSERV][2][30]; // Servers list extern char start[MAXSTART][5][30]; // Startpoints list extern int acctno[MAXCLIENT]; extern unsigned int currchar[MAXCLIENT]; extern int freecharmem[301]; //stores pointers to deleted char struct memory extern int cmemcheck; //stores point to freecharmem no. that stores last delete char memory extern char cmemover; // 0 means freecharmem buffer has not been overflowed, 1 means overflowed extern int freeitemmem[501]; //stores pointers to deleted item struct memory extern int imemcheck; //stores point to freeitemmem no. that stores last delete item memory extern char imemover; // 0 means freeitemmem buffer has not been overflowed, 1 means overflowed extern char xcounter; extern char ycounter; //x&y counter used for placing deleted items and chars extern char clientip[MAXCLIENT][4]; extern int secure; // Secure mode extern char fametitle[128]; extern char skilltitle[50]; extern char prowesstitle[50]; extern unitile_st xyblock[XYMAX]; extern int xycount; extern char_st chars[MAXCHARS]; // - the below structure is for looking up items based on serial # // - item's serial, owner's serial, char's serial, and container's serial extern lookuptr_st itemsp[256], ownsp[256], spawnsp[256], contsp[256]; extern lookuptr_st charsp[256], cownsp[256], cspawnsp[256]; extern item_st items[MAXITEMS]; extern teffect_st teffects[MAXEFFECTS]; extern location_st location[1000]; extern region_st region[256]; extern skill_st skill[50]; extern advance_st advance[1000]; extern make_st itemmake[MAXCLIENT]; extern int locationcount; extern gmpage_st gmpages[MAXPAGES]; extern gmpage_st counspages[MAXPAGES]; extern jail_st jails[11]; extern unsigned int charcount; extern unsigned int charcount2; extern unsigned int itemcount; extern unsigned int itemcount2; extern char *cline; extern char *comm[CMAX]; extern int tnum; extern char addid1[MAXCLIENT]; extern char addid2[MAXCLIENT]; extern char addid3[MAXCLIENT]; extern char addid4[MAXCLIENT]; extern int npcshape[5]; //Stores the coords of the bouding shape for the NPC extern char dyeall[MAXCLIENT]; extern int addx[MAXCLIENT]; extern int addy[MAXCLIENT]; extern int addz[MAXCLIENT]; extern int addmitem[MAXCLIENT]; extern char xtext[MAXCLIENT][31]; extern char perm[MAXCLIENT]; extern char monitor[100]; extern unsigned int starttime, endtime, lclock; extern char overflow; extern char idname[256]; extern char globallight; extern char wtype; extern char script1[512]; extern char script2[512]; extern char script3[512]; extern char script4[512]; // added to use for newbie items extern char pass1[256]; extern char pass2[256]; extern int executebatch; extern int showlayer; extern int talkingto[MAXCHARS]; extern int ph1, ph2, ph3, ph4; extern int openings; extern int funnypack[MAXCLIENT]; extern int binlength[MAXIMUM+1]; extern int boutlength[MAXIMUM+1]; extern char tempflag; extern char xoutbuffer[MAXBUFFER*2]; extern char cryptclient[MAXCLIENT]; extern unsigned int cryptmask[MAXCLIENT][2]; extern char usedfree[MAXCLIENT]; extern int freelogins; extern int resendweathertime; extern int shoprestocktime; extern int shoprestockrate; extern int respawntime; extern int gatedesttime; extern int stablockcachex[STABLOCKCACHESIZE]; extern int stablockcachey[STABLOCKCACHESIZE]; extern int stablockcachez[STABLOCKCACHESIZE]; extern int stablockcacher[STABLOCKCACHESIZE]; extern int stablockcachei; extern int stablockcachehit; extern int stablockcachemiss; extern int layers[MAXLAYERS]; extern int clickx[MAXCHARS]; extern int clicky[MAXCHARS]; extern int spattackValue[MAXCHARS]; extern int currentSpellType[MAXCHARS]; // 0=spellcast, 1=scrollcast, 2=wand cast extern char gettokenstr[256]; extern int donpcupdate; extern char targetok[MAXCHARS]; extern tracking_st tracking_data; extern begging_st begging_data; extern fishing_st fishing_data; extern spiritspeak_st spiritspeak_data; extern server_st server_data; extern title_st title[ALLSKILLS+1]; extern int triggerx; extern int triggery; extern int triggerz; extern int hungerdamagetimer; // Used for hunger damage // Profiling extern int networkTime; extern int timerTime; extern int autoTime; extern int loopTime; extern int networkTimeCount; extern int timerTimeCount; extern int autoTimeCount; extern int loopTimeCount; // Script files that need to be cached // NOTE: this will be read in before main() extern Script items_script, npc_script, create_script, regions_script, misc_script, skills_script, location_script, menus_script, spells_script, speech_script, tracking_script, newbie_script, titles_script, advance_script, trigger_script,ntrigger_script,wtrigger_script,necro_script,house_script; // // Function Declarations // // functions in magic.cpp void recall(int s); void mark(int s); char gate(int s); char gatecollision(int s); void gatedestruction(unsigned int); void checkfieldeffects(unsigned int); void heal(int s); int castspell(int s, int num, int type, int Numitem); // if type 2 you need to put Numitem to check for weapon equipped otherwise set it to 0 void summonmonster(int s, char id1, char id2, char * monstername, char color1=0, char color2=0,int x=0, int y=0, int z=0); void createfoodtarget(int s); int checkBook(int circle, int spell, int i); void spellbook(int s); void hide(int s); void invistarget(int s); void magicarrowtarget(int s); void evtarget(int s); void bstarget(int s); void flamestriketarget(int s); void explosiontarget(int s); void cannontarget(int s); void lightningtarget(int s); void fireballtarget(int s); void ebolttarget(int s); void reveal(int s); void healtarget(int s); void greaterhealtarget(int s); void harmtarget(int s); void poisontarget(int s); void curetarget(int s); void sbopencontainer(int s); void spellfail(int s); char checkmana(int s, int circle); char subtractmana(int s, int circle); void magicreflectiontarget(int s); void dispeltarget(int s); void firefieldtarget(int s); void wallofstonetarget(int s); void parafieldtarget(int s); void energyfieldtarget(int s); void dispelfieldtarget(int s); void paralyzetarget(int s); void mindblasttarget(int s); void poisonfieldtarget(int s); void nightsighttarget(int s); void clumsytarget(int s); void feeblemindtarget(int s); void weakentarget(int s); void agilitytarget(int s); void cunningtarget(int s); void strengthtarget(int s); char checkmagicreflect(int i); char checkresist(int player, int circle); void magicdamage(int p, int amount); void poisondamage(int p, int amount); void blesstarget(int s); void cursetarget(int s); void delereagents(int s, int ash, int drake, int garlic, int ginseng, int moss, int pearl, int shade, int silk); char checkreagents(int s, int ash, int drake, int garlic, int ginseng, int moss, int pearl, int shade, int silk); void regmsg(int s); void pfireballtarget(int i, int k, int j); void resurrecttarget(int s); void directdamage(int p, int amount); void npcfireballtarget(int s, int t); void npclightningtarget(int s, int t); void npccursetarget(int s, int t); void npcweakentarget(int s, int t); void npcfeeblemindtarget(int s, int t); char checkparry(int player, int circle); void npcclumsytarget(int s, int t); void npcmindblasttarget(int s, int t); void npcmagicarrowtarget(int s, int t); void npcharmtarget(int s, int t); void npcparalyzetarget(int s, int t); void npcebolttarget(int s, int t); void npcexplosiontarget(int s, int t); void npcflamestriketarget(int s, int t); void clumsyspellitem(int attaker, int defender); void feeblemindspellitem(int attaker, int defender); void magicarrowspellitem(int attaker, int defender); void weakenspellitem(int attaker, int defender); void harmspellitem(int attaker, int defender); void fireballspellitem(int attaker, int defender); void cursespellitem(int attaker, int defender); void lightningspellitem(int attaker, int defender); void mindblastspellitem(int attaker, int defender); void paralyzespellitem(int attaker, int defender); void explosionspellitem(int attaker, int defender); void flamestrikespellitem(int attaker, int defender); void manadraintarget(int s); void manavampiretarget(int s); void meteorswarmptarget(int s); void chainlightningtarget(int s); void archprotection(int s); void archcuretarget(int s); void masscursetarget(int s); void massdispeltarget(int s); void magiclocktarget(int s); void magictrap(int s, int i); void magictraptarget(int s); void magicuntraptarget(int s); void summonmonstertarget(int s); void reactivearmortarget(int s); void boxspell(int s, int &x1, int &x2, int &y1, int &y2, int &z1, int &z2); int wheresub(int i, int p); // functions in skills.cpp void updateSkillLevel(int c, int s); void fishtarget(int s); void treetarget(int s); void detecthidden(int s); int getinstrument(int s); void peacemaking(int s); void enticementtarget1(int s); void enticementtarget2(int s); void provocationtarget1(int s); void provocationtarget2(int s); void playinstrumentwell(int s, int i); void playinstrumentpoor(int s, int i); void carpentry(int s); void smith(int s); void anviltarget(int s, int m); void anviltargetgold(int s, int m);//for goldsmithing void makemenutarget(int s, int x, int skill); void makemenu(int s, int m, int skill); void mine(int s); void gravedig(int s); void smeltore(int s); //void smeltgold(int s);//goldsmelting void wheel(int s, int mat); void loom(int s); void fletching(int s); void bowcraft(int s); void makedough(int s); void makepizza(int s); void buildcannon(int s); void cookmeat(int s); void tailoring(int s); char checkskill(int s,unsigned short int skill, int low, int high); void alchemytarget(int s); void bottletarget(int s); void dopotion(int s, int type, int sub, int mortar); void createpotion(int s, char type, char sub, int mortar); void potiontobottle(int s, int mortar); char advanceskill(int s, int sk, char skillused); void advancestats(int s, int sk); void createbandagetarget(int s); void healingSkillTarget(int s); void spiritspeak(int s); int getcombatskill(int s); int getshield(int s); int getbowtype(int i); void tametarget(int s); void anatomytarget(int s); void evaluate_int_target(int s); void itemidtarget(int s); void armsloretarget(int s); void skilluse(int s, int x); void tracking(int,int); void trackingmenu(int,int); void createtrackingmenu(int,int); void track(int); int trackingdirection(int,int); void beggingtarget(int); void animalloretarget(int); void fish(unsigned int); int inscribe(int s,long snum); int engraveaction(int s, int i, int cir, int spl); void tellscroll( char *menu_name, int player, long item_param ); void tdummy(int s); void newdummy(unsigned int currenttime); void tinkering(int s); void sendbpitem(int s, int i); void AButte(int s,int x); void tinkeraxel(int s); void tinkerawg(int s); void tinkerclock(int s); void stealingtarget(int s); // functions in combat.cpp int getbowtype(int i); void combat(int i, unsigned int currenttime); int calcatt(int p); int calcdef(int p, int x); int timerok (int c); void combatonhorse(int player_char); void combatonfoot(int player_char); void spawnguard(int s, int i, int x, int y, int z); void itemspell(int attaker, int defender); // Functions in weight.cpp float calcweight(int p); float calcweightpack(int backpack); char CheckMaxWeightPack(int pack); int checkweight(int s, int k); void additemweight(int i, int s); void subtractitemweight(int i, int s); int checkwhereitem( int pack, int i, int s); void updateweight(int c); void seekmulti(int multinum, FILE **mfile, long int *length); // functions in uox3.cpp void readini(); void all_items(int s); void savelog(const char *msg, char *logfile); void seektile(int tilenum, tile_st *tile); void staticeffect(int player, char eff1, char eff2, char speed, char loop); //for chars void staticeffect2(int nItem, char eff1, char eff2, char speed, char loop, char explode); //for items void movingeffect(int source, int dest, char eff1, char eff2, char speed, char loop, char explode); void movingeffect2(int source, int dest, char eff1, char eff2, char speed, char loop, char explode); void explodeitem(int s, unsigned int nItem); void bolteffect(int player); void addrespawnitem(int s, int x, int y); void addrespawnnpc(int s, int x, int type); void deletechar (int k); int memcharfree (); int memitemfree (); void monstergate(int s, int x); void respawn(unsigned int); void decay(unsigned int); void npcMovement(unsigned int); void checknpcai(unsigned int); int SpawnItemBackpack(int s, int nAmount, char* cName, int nStackable, char cItemId1, char cItemId2, char cColorId1, char cColorId2); int SpawnItemBackpack2(int s, int nItem, int nDigging); void Karma(int nCharID,int nKilledID, int nKarma); void Fame(int nCharID, int nFame); void charstartup(int s); void checkdumpdata(unsigned int currenttime); // This dumps data for Ridcully's UOXBot 0.02 (jluebbe@hannover.aball.de) // functions in necro.cpp int SpawnRandomMonster(int nCharID, char* cScript, char* cList, char* cNpcID); int SpawnRandomItem(int nCharID,int nInPack, char* cScript, char* cList, char* cItemID); void vialtarget(int nSocket); void MakeNecroReg(int nSocket,int nItem,char cItemID1,char cItemID2); #ifndef __NT__ unsigned long int getclock(); #endif #ifdef __NT__ #define getclock() clock() #else #undef CLOCKS_PER_SEC #define CLOCKS_PER_SEC 100 #endif void npcaction(int npc, int x); int calcgold(int p); int packitem(int p); void titletarget(int s); void npcact(int s); void objTeleporters(int s); void npcToggleCombat(int s); int chardir(int a, int b); int calcSocketFromChar(int i); int validNPCMove(int x, int y, int z, int s); char stablock(int x, int y, int oldz); char oldstablock(int x, int y, int oldz); int calcItemFromSer(int ser1, int ser2, int ser3, int ser4); int calcCharFromSer(int ser1, int ser2, int ser3, int ser4); int calcCharFromSer(int ser); int calcSerFromChar(int ser); int checkBoundingBox(int xPos, int yPos, int fx1, int fy1, int fz1, int fx2, int fy2); int checkBoundingCircle(int xPos, int yPos, int fx1, int fy1, int fz1, int radius); void inititem(int i); void updatechar(int c); void deleitem(int i); char tileheight(int tilenum); void axetarget(int s); void corpsetarget(int s); void carvetarget(int s, int feat, int ribs, int hides, int fur, int wool); int unmounthorse(int s); void swordtarget(int s); void initchar(int x); void telltime(int s); void visibletarget(int s); void setdirtarget(int s); void privtarget(int s); void objprivtarget(int s); void impaction(int s, int act); int chardirxyz(int a, int x, int y, int z); int fielddir(int s, int x, int y, int z); int checkforchar(int x, int y, int z); char tempeffect(int source, int dest, int num, char more1, char more2, char more3); char tempeffect2(int source, int dest, int num, char more1, char more2, char more3); void tempeffectsoff(); void tempeffectson(); void checktempeffects(); void npcattacktarget(int target2, int target); void npcsimpleattacktarget(int target2, int target); void npcresurrecttarget(int i); void npcaitarget(int s); int RandomNum(int nLowNum, int nHighNum); void enlist(int s, int listnum); // For enlisting in army // Day and Night related prototypes void doworldlight(void); void dolight(int s, char level); char indungeon(int s); void setabovelight(char); //For setting the various npc wandering vars void npcwandertarget(int s); void npctarget(int s); void npctarget2(int s); void npcrecttarget(int s); void npccircletarget(int s); void goldsfx(int s, int goldtotal); // EviLDeD - I noticed that this was prototyped. Just thought // I would take the liberty to do so // December 23, 1998 void gcollect(); // EviLDeD - End char iteminrange (int s, int i, int distance); void updateskill(int s, int skillnum); char npcinrange (int s, int i, int distance); //check for horse distance... void xbanktarget(int s); void openbank(int s, int i); char inbankrange(int i); void deathaction(int s, int x); void deathmenu(int s); int getamount(int s, char id1, char id2); int getsubamount(int p, char id1, char id2); void delequan(int s, int id1, int id2, int amount); int delesubquan(int p, int id1, int id2, int amount); void movetobagtarget(int s); void dupetarget(int s); void impowncreate(int s, int i, int z); //socket, player to send, send z (0) or dispz (1) int addmenutarget(int s, int x, int addmitem); void gettokennum(char * s, int num); int addrandomloot(int s, char * lootlist); void setrandomname(int s, char * namelist); int addrandomnpc(int s, char * npclist, int spawnpoint); void addrandomitem(int s, char * itemlist, int spawnpoint); void showgmque(int s, int type); void nextcall(int s, int type); void donewithcall(int s, int type); void initque(); void gotocurcall(int s); void gmtransfer(int s); void jailtarget(int s,int c); void releasetarget(int s,int c); void gmopentarget(int s); void manatarget(int s); void staminatarget(int s); void makeshoptarget(int s); void makeshop(int c); void buyshoptarget(int s); int buyshop(int s, int c); void sendshopinfo(int s, int c, int i); int getname(int i, char* itemname); void buyaction(int s); void dupeitem(int s, int i, int amount); void restock(int s); void setrestocktarget(int s); void setvaluetarget(int s); int response(int s); void responsevendor(int s); void attacktarget(int s); void followtarget(int s); void transfertarget(int s); void fetchtarget(int s); void who(int s); void gms(int s); void soundeffect3(int p, unsigned char a, unsigned char b); void playmonstersound(int monster, int id1, int id2, int sfx); void sellstufftarget(int s); int sellstuff(int s, int i); void sellaction(int s); void addgold(int s, int totgold); void playmidi(int s, char num1, char num2); void tradetesttarget(int s); void gumpopen(int s, int i, int num1, int num2); void statwindow(int s, int i); void usepotion(int p, int i); int calcValue(int i, int value); int tradestart(int s, int i); void clearalltrades(); void trademsg(int s); void endtrade(int b1, int b2, int b3, int b4); void sendtradestatus(int cont1, int cont2); void dotrade(int cont1, int cont2); void loadregions(); void checkregion(int i); char calcRegionFromXY(int x, int y); void dosocketmidi(int s); void wipe(int s); void wipenpcs(int s); void respawnnow(); void tellmessage(int i, int s, char *txt); void fullstatstarget(int s); void setspattacktarget(int s); void setspadelaytarget(int s); void setpoisontarget(int s); void setpoisonedtarget(int s); void setadvobjtarget(int s); void permHideTarget(int s); void unhidetarget(int s); void setwipetarget(int s); void setspeechtarget(int s); void xteleport(int s,int x); void sysmessage(int s, char *txt); void senditem(int s, int i); void soundeffect(int s, unsigned char a, unsigned char b); void soundeffect2(int p, unsigned char a, unsigned char b); void updatestats(int c, char x); void action(int s, int x); int str2num (char *s); int hstr2num (char *s); void closescript (); void openscript (char *name); void itemmenu(int s, int m); void npcemote(int s, int npc, char *txt); void npcemoteall(int npc, char *txt); void target(int s, int a1, int a2, int a3, int a4, char *txt); int findsection (char *s); void read1 (); void read2 (); void itemmessage(int s, char *txt, int a1, int a2, int a3, int a4); int inrange1p (int a, int b); void xsend(int s, void *point, int length, int test); void deathstuff(int i); int online(int c); char height(int x, int y, int oldz); void teleport(int s); void npctalkall(int npc, char *txt); void npctalk(int s, int npc, char *txt); // NPC speech void cantraintarget(int s); //NPC Training void backpack(int s, int a1, int a2, int a3, int a4); void loadserverscript(void); void saveserverscript(char); void loadserverdefaults(void); void loadserver(void); void loadtracking(void); void loadspiritspeak(void); void loadbegging(void); void loadfishing(void); void loadtime_light(); void loadskills(); int numbitsset( int number ); int whichbit( int number, int bit ); unsigned int chardist (int a, int b); void sysbroadcast(char *txt); void target(int s, int a1, int a2, int a3, int a4, char *txt); int addnpcxyz(int s, int x, int type, int x1, int y1, int z1); //Townstone related Functions char *townname(int x, int type); int townpopulation(int j); char *townmayor(int j); char *townmayorvote(int s); void townvoteformayortarget(int s); void townline(int line, int j, char type, int s); void towntext(int line, int j, char type, int s); void townmenu(int s, int j, int type); void towninit(void); void usehairdye(int s, int x); void buildhouse(int s, int i); void addthere(int s, int xx, int yy, int zz, int t); void mtarget(int s, int a1, int a2, int a3, int a4, char b1, char b2, char *txt); void lockpick(int s); int getweapon(int i); item_st* GetItemPointerByNumber(int number); item_st* GetItemPointerBySerial(int serial); #ifdef __NT__ void Writeslot(LPSTR lpszMessage); #else void Writeslot(char *lpszMessage); #endif int getstatskillvalue(char *stringguy); // for newbie stuff int bestskill(int p); int secndbstskll(int m, int bstskll); int thrdbstskll(int n, int scnbst); //void addfromitemlist(int itemlist,int c); void newbieitems(unsigned int c); void read3 (); void read4 (); void readscript (); //For custom titles void loadcustomtitle(); // Profiling void StartMilliTimer(unsigned long &Seconds, unsigned long &Milliseconds); unsigned long CheckMilliTimer(unsigned long &Seconds, unsigned long &Milliseconds); void advancementobjects(int s, int x, int always); void itemsfx(int s, int ID1, int ID2); void bgsound(int s); void splitline(); int hexnumber(int countx); int makenumber(int countx); // Dupois - fileArchive() prototypes // Added Oct 20, 1998 void fileArchive(char *pFile2Archive, char *pArchiveDir); void ArchiveID(char archiveid[MAXARCHID]); // End - Dupois void enlist(int s); // For enlisting in army //int SpawnItemBackpack(int s, int nAmount, char* cName, int nStackable, char cItemId1, char cItemId2, char cColorId1, char cColorId2); void loadaccounts(); void readini(); //Trigger routines void triggerwitem(int ts, int ti, int ttype); // trigger.cpp void triggernpc(int ts,int ti) ; // trigger.cpp void setitemtrigger(int s); //uoxse.cpp void setnpctrigger(int s); //uoxse.cpp void settriggertype(int s); //uoxse.cpp void settriggerword(int s); //uoxse.cpp int checkenvoke(char eid1, char eid2); //trigger.scp // Splitting NPCs // McCleod int split( int k); inline int calcserial(char a1,char a2,char a3,char a4) {return ((a1*16777216)+(a2*65536)+(a3*256)+a4);} // Item Functions in items.cpp int SpawnItem(int s, int nAmount, char* cName, int nStackable, char cItemId1, char cItemId2, char cColorId1, char cColorId2, int nPack, int nSend); int CreateScriptItem(int s, int itemnum, int nSpawned); void CreateScriptRandomItem(int s, char * sItemList); // Pointer.cpp functions // - set item in pointer array void setptr(lookuptr_st *ptr, int item); // - remove item from pointer array int removefromptr(lookuptr_st *ptr, int nItem); // - find item in a pointer array int findbyserial(lookuptr_st *ptr, int nSerial, int nType); // - set serial#s and ptr arrays void setserial(int nChild, int nParent, int nType); // the stuff McCleod added void setsplittarget(int s); void setsplitchancetarget(int s); void possess(int s); //Not done int line_of_sight(int s, int x1, int y1, int z1, int x2, int y2, int z2, int checkfor);