]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/tfclient.c
now menu qc respects g_campaign_name
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / tfclient.c
1 float intermission_running;                             // This was moved here from mauvebot.c\r
2 float intermission_exittime;                    // This was moved here from g_world.c\r
3 void (entity AD) ParseTFDetect;\r
4 \r
5 entity () FindIntermission =\r
6 {\r
7         local entity spot;\r
8         local float cyc;\r
9 \r
10         spot = find (world, classname, "info_intermission");\r
11         if (spot)\r
12         {\r
13                 cyc = (random () * 1);\r
14                 return (spot);\r
15         }\r
16         spot = find (world, classname, "info_player_start");\r
17         if (spot)\r
18         {\r
19                 return (spot);\r
20         }\r
21         spot = find (world, classname, "info_player_deathmatch");\r
22         if (spot)\r
23         {\r
24                 cyc = (random () * 6);\r
25                 while ((cyc > 1))\r
26                 {\r
27                         spot = find (spot, classname, "info_player_deathmatch");\r
28                         if (!spot)\r
29                         {\r
30                                 spot = find (spot, classname, "info_player_deathmatch");\r
31                         }\r
32                         cyc = (cyc - 1);\r
33                 }\r
34                 return (spot);\r
35         }\r
36         objerror ("FindIntermission: no spot");\r
37 };\r
38 \r
39 // This sets all the settings for the level including teams allowed, and lives and legal classes etc.\r
40 // it is called only once, for the first player who joins\r
41 void () DecodeLevelParms =\r
42 {\r
43                 if (parems_decoded == 1)\r
44                         return;\r
45                 else {\r
46                         // The following allows play on Nexuiz/NexCTF maps if there is no info_tfdetect on a map\r
47                         if (team1maxplayers == 0)\r
48                                 team1maxplayers = 4;\r
49                         if (team2maxplayers == 0)\r
50                                 team2maxplayers = 4;\r
51 //                      if (number_of_teams > 2)\r
52 //                      {\r
53                                 if (team3maxplayers == 0)\r
54                                         team3maxplayers = 4;\r
55                                 if (team4maxplayers == 0)\r
56                                         team4maxplayers = 4;\r
57                                 if (team3lives == 0)\r
58                                         team3lives = -1;\r
59                                 if (team4lives == 0)\r
60                                         team4lives = -1;\r
61 //                      }\r
62                         if (team1lives == 0)\r
63                                 team1lives = -1;\r
64                         if (team2lives == 0)\r
65                                 team2lives = -1;\r
66 \r
67                         local entity decent;\r
68                         decent = find (world, classname, "info_tfdetect");\r
69                         if ((decent != world))\r
70                         {\r
71 //                              teamplay = cvar ("teamplay");\r
72 //                              if ((teamplay == 0))\r
73 //                              {\r
74                                         cvar_set ("teamplay", "21?TeamFortress");\r
75 //                              }\r
76                                 ParseTFDetect (decent);         // This returns the map's team/class allowances\r
77                                 if (((number_of_teams <= 0.000000) || (number_of_teams >= 5.000000)))\r
78                                 {\r
79                                         number_of_teams = 4.000000;\r
80                                 }\r
81                         }\r
82                 }\r
83                 parems_decoded = 1;\r
84 };\r
85 \r
86 // Execute Change Level\r
87 void () execute_changelevel =\r
88 {\r
89         local entity pos;\r
90 \r
91         intermission_running = 1;\r
92         if (deathmatch)\r
93         {\r
94                 intermission_exittime = (time + 5);\r
95         }\r
96         else\r
97         {\r
98                 intermission_exittime = (time + 2);\r
99         }\r
100         WriteByte (2, 32);\r
101         WriteByte (2, 3);\r
102         WriteByte (2, 3);\r
103         pos = FindIntermission ();\r
104         other = find (world, classname, "player");\r
105         while ((other != world))\r
106         {\r
107                 other.view_ofs = '0 0 0';\r
108                 other.v_angle = pos.mangle;\r
109                 other.angles = pos.mangle;\r
110                 other.fixangle = 1;\r
111                 other.nextthink = (time + 0.5);\r
112                 other.takedamage = 0;\r
113                 other.solid = 0;\r
114                 other.movetype = 0;\r
115                 other.modelindex = 0;\r
116                 setorigin (other, pos.origin);\r
117                 other = find (other, classname, "player");\r
118         }\r
119         WriteByte (2, 30);\r
120 };\r
121 \r
122 .entity teambubble_needhealth;          // displays when player's health is below 30%\r
123 .entity teambubble_friendly;            // displays that player is friendly teammate\r
124 //repeated defs:\r
125 .float buttonchat;\r
126 .entity exteriormodeltoclient;\r
127 \r
128 void() TeamBubbleThink =\r
129 {\r
130         self.nextthink = time;\r
131         if (!self.owner.modelindex || self.owner.teambubble_friendly != self)\r
132         {\r
133                 remove(self);\r
134                 return;\r
135         }\r
136         //setorigin(self, self.owner.origin + '0 0 15' + self.owner.maxs_z * '0 0 1'); //bandwidth hax\r
137         if (self.owner.buttonchat || self.owner.deadflag)\r
138                 self.model = "";\r
139         else\r
140                 self.model = self.mdl;\r
141         \r
142 };\r
143 \r
144 .float() customizeentityforclient;              // new DP extension used for the team bubble\r
145 float() ChatBubble_customizeentityforclient = {return (self.owner.team_no == other.team_no && other.killcount > -666);};\r
146 \r
147 \r
148 void() UpdateTeamBubble =\r
149 {\r
150         if (!self.modelindex || !cvar("teamplay"))\r
151                 return;\r
152         // spawn a teambubble entity if needed\r
153         if (!self.teambubble_friendly && cvar("teamplay"))\r
154         {\r
155                 self.teambubble_friendly = spawn();\r
156                 self.teambubble_friendly.owner = self;\r
157                 self.teambubble_friendly.exteriormodeltoclient = self;\r
158                 self.teambubble_friendly.think = TeamBubbleThink;\r
159                 self.teambubble_friendly.nextthink = time;\r
160                 setmodel(self.teambubble_friendly, "models/team/team.sp2");\r
161 //              setorigin(self.teambubble_friendly, self.origin + '0 0 15' + self.maxs_z * '0 0 1');\r
162                 setorigin(self.teambubble_friendly, self.teambubble_friendly.origin + '0 0 10' + self.maxs_z * '0 0 1');\r
163                 setattachment(self.teambubble_friendly, self, "");\r
164                 self.teambubble_friendly.scale = .07;\r
165                 self.teambubble_friendly.mdl = self.teambubble_friendly.model;\r
166                 self.teambubble_friendly.model = self.teambubble_friendly.mdl;\r
167                 self.teambubble_friendly.customizeentityforclient = ChatBubble_customizeentityforclient;\r
168         }\r
169 }\r