]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/gamec/bots.c
add g_navnodeedit
[divverent/nexuiz.git] / data / qcsrc / server / gamec / bots.c
1 float BOT_TYPE_AUTOURRE = 0;
2 float BOT_TYPE_AUTOMAUVE = 1;
3 float BOT_TYPE_URREBOT = 2;
4 float BOT_TYPE_MAUVEBOT = 3;
5 .float bot_type;
6 float bot_number;
7
8 /*
9 MauveBot v1.0 for Nexuiz
10 */
11
12 float intermission_running;
13
14 .float skill_level;
15
16 .float ai_time;
17 .float threat;
18 .entity dodgeent;
19
20 float THREAT_UNFLAGGED = 0;
21 float THREAT_IGNORE = -1;
22
23 float DODGE_DIST = 500;
24 float SEARCH_DIST = 1000;
25
26 .float search_time;
27
28 float mauvebots;
29
30 entity(float bottype) add_MauveBot;
31 void() remove_MauveBot;
32
33 /*
34 UrreBot 1.5 for Nexuiz
35 */
36
37 entity navnode_chain, urrebot_chain;
38 float navnodes, loadstep;
39 .entity list, link0, link1, link2, link3, link4, link5, link6, link7, link8, link9;
40 .entity link10, link11, link12, link13, link14, link15, link16, link17, link18, link19;
41 .float sflags;
42 .float lflags0, lflags1, lflags2, lflags3, lflags4, lflags5, lflags6, lflags7, lflags8, lflags9;
43 .float lflags10, lflags11, lflags12, lflags13, lflags14, lflags15, lflags16, lflags17, lflags18, lflags19;
44 .vector pointl;
45 .float costl;
46 .float lmark;
47 float search_distance;
48 float minisearch_distance;
49 float stratsearch_distance;
50 .entity goalcurrent;
51 .entity goallist;
52 .float strat_me;
53 .float(entity c_item) evalfunc;
54
55 vector nullvector;
56 .vector movepoint;
57 .float camptime;
58 .vector campcheck;
59
60 .vector aimpoint;
61 .float aimtime;
62 .float evaltime;
63 .float lead;
64
65 float skill;
66
67 float S_TELEPORT = 1;
68 float S_DOOR = 2;
69 float S_TOUCH = 4;
70
71 float LF_NOLINK = 1;
72 float LF_NOWALK = 2;
73 float LF_BAD = 4;
74 float LF_BIGDROP = 8;
75 float LF_REMOTE = 16;
76
77 .entity plane_chain;
78
79 float urrebots, urrebots_strategytime, urrebots_combattime;
80
81 entity strategytoken;
82 float strategytime;
83 .float combattime;
84
85 entity(vector org, vector minss, vector maxss) FindCurrentNavNode;
86 void(float distance) UrreBotPath;
87 void() UrreBotSetup;
88 void() UrreBotThink;
89 void() LoadNavNodes;
90 void() LinkNavNodes;
91 void() ItemEvals;
92 entity(float bottype) UrreBotAdd;
93 void() UrreBotRemove;
94
95 float(vector m1, vector m2, vector m3, vector m4) boxesoverlap = {return m2_x >= m3_x && m1_x <= m4_x && m2_y >= m3_y && m1_y <= m4_y && m2_z >= m3_z && m1_z <= m4_z;};
96 float(vector smins, vector smaxs, vector bmins, vector bmaxs) boxenclosed = {return smins_x >= bmins_x && smaxs_x <= bmaxs_x && smins_y >= bmins_y && smaxs_y <= bmaxs_y && smins_z >= bmins_z && smaxs_z <= bmaxs_z;};
97
98 entity newmis;
99 void() SUB_Remove;
100 float JoinBestTeam(entity pl, float only_return_best);
101 float sv_maxspeed;
102
103 void() AutoBotRemove =
104 {
105         local entity ent, t;
106
107         ent = findchain(classname, "player");
108         while (ent)
109         {
110                 if (clienttype(ent) == CLIENTTYPE_BOT)
111                 {
112                         if (ent.bot_type != BOT_TYPE_URREBOT && ent.bot_type != BOT_TYPE_MAUVEBOT)
113                         {
114                                 if (self.list)
115                                 {
116                                         if (urrebot_chain == self)
117                                                 urrebot_chain = self.list;
118                                         else
119                                         {
120                                                 t = find(world, classname, "player");
121                                                 while(t)
122                                                 {
123                                                         if (t.list == ent)
124                                                                 t.list = ent.list;
125                                                         t = find(t, classname, "player");
126                                                 }
127                                         }
128                                 }
129                                 if (bot_number > 0)
130                                         bot_number -= 1;
131                                 //if(cvar("g_lms") && self.frags < 1) // DP_SV_BOTCLIENT handles this automaticly
132                                 //      lms_dead_count -= 1;
133                                 dropclient(ent);
134                         }
135                 }
136                 ent = ent.chain;
137         }
138 };
139
140 void() Bots_Shared =
141 {
142         local entity bot;
143         local float f;
144
145         if (time >= 3)
146         {
147                 // UrreBots
148                 if (loadstep == 0)
149                 {
150                         LoadNavNodes();
151                         loadstep = 1;
152                         return;
153                 }
154                 else if (loadstep == 1)
155                 {
156                         LinkNavNodes();
157                         loadstep = 2;
158                         return;
159                 }
160                 else if (loadstep == 2)
161                 {
162                         ItemEvals();
163                         loadstep = 3;
164                         return;
165                 }
166                 f = cvar("urrebots");
167                 urrebots_strategytime = cvar("urrebots_strategytime");
168                 urrebots_combattime = cvar("urrebots_combattime");
169                 stratsearch_distance = cvar("urrebots_stratsearch_dist");
170                 minisearch_distance = cvar("urrebots_minisearch_dist");
171                 if (urrebots < f)
172                 {
173                         bot = UrreBotAdd(BOT_TYPE_URREBOT);
174                         bot.bot_type = BOT_TYPE_URREBOT;
175                         urrebots = urrebots + 1;
176                 }
177                 if (urrebots > f)
178                         UrreBotRemove();
179
180                 // MauveBots
181                 f = cvar("mauvebots");
182                 if (f > mauvebots)
183                 {
184                         bot = add_MauveBot(BOT_TYPE_MAUVEBOT);
185                         bot.bot_type = BOT_TYPE_MAUVEBOT;
186                         mauvebots = mauvebots + 1;
187                 }
188                 else if (f < mauvebots)
189                         remove_MauveBot();
190
191                 // AutoBots
192                 f = cvar("bot_number");
193                 if (f > bot_number)
194                 {
195                         bot = world;
196                         if (navnodes)
197                         {
198                                 bot = UrreBotAdd(BOT_TYPE_AUTOURRE);
199                                 if (bot)
200                                 {
201                                         bot.bot_type = BOT_TYPE_AUTOURRE;
202                                         bot_number += 1;
203                                 }
204                         }
205                         else
206                         {
207                                 bot = add_MauveBot(BOT_TYPE_AUTOMAUVE);
208                                 if (bot)
209                                 {
210                                         bot.bot_type = BOT_TYPE_AUTOMAUVE;
211                                         bot_number += 1;
212                                 }
213                         }
214                 }
215                 else if (f < bot_number)
216                         AutoBotRemove();
217         }
218         else
219         {
220                 AutoBotRemove();
221                 remove_MauveBot();
222                 UrreBotRemove();
223         }
224 };