player.qc (5698B)
1 // 2 // Player.qc - Various stuff done for the player, including per-frame functions like PlayerPreThink and PlayerPostThink, also client specific stuff like PutClientInServer etc. 3 // 4 5 void() PlayerJump = 6 { 7 if (!(self.flags & FL_ONGROUND)) 8 return; 9 10 if ( !(self.flags & FL_JUMPRELEASED) ) 11 return; 12 13 self.flags = self.flags - (self.flags & FL_JUMPRELEASED); 14 sound(self, CHAN_VOICE, "sounds/ouch.wav", 1, 1.75); 15 self.button2 = 0; 16 } 17 18 void() CheckImpulses = 19 { 20 if(self.impulse == 1) 21 SwitchWeapon(IT_PISTOL); 22 else if(self.impulse == 2) 23 SwitchWeapon(IT_MG); 24 25 self.impulse = 0; 26 } 27 28 void() PlayerPreThink = 29 { 30 if(self.isspec != 0) 31 { 32 if(self.button0 && time > self.ready) 33 { 34 self.aiment = find(self.aiment, classname, "player"); 35 if(self.aiment != world) 36 { 37 sprint(self, PRINT_HIGH, "Now spectating "); 38 sprint(self, PRINT_HIGH, self.aiment.netname); 39 sprint(self, PRINT_HIGH, "\n"); 40 41 self.solid = SOLID_NOT; 42 self.movetype = MOVETYPE_NONE; 43 } 44 else 45 { 46 sprint(self, PRINT_HIGH, "Freefly spectate\n"); 47 self.movetype = MOVETYPE_FLY; 48 } 49 self.ready = time + 0.5; 50 } 51 if(self.aiment != world) 52 { 53 self.origin = self.aiment.origin; 54 self.angles = self.aiment.v_angle; 55 self.velocity = self.aiment.velocity; 56 self.fixangle = TRUE; 57 } 58 return; 59 } 60 61 CheckImpulses(); 62 63 if(self.button0) 64 { 65 FireWeapon(); 66 } 67 else 68 { 69 if(time > self.ready) 70 { 71 self.readystate = READY; 72 } 73 else if(self.readystate == FIRING_SEMI) 74 { 75 self.readystate = FIRING; 76 } 77 } 78 if(self.button2) 79 { 80 PlayerJump (); 81 } 82 else 83 self.flags = self.flags | FL_JUMPRELEASED; 84 }; 85 86 void() PlayerPostThink = 87 { 88 if(self.isspec) 89 return; 90 91 //landsound 92 if((self.oldvelocity_z < -10) && (self.flags & FL_ONGROUND)) 93 { 94 if(self.oldvelocity_z < -270) 95 sound(self, CHAN_BODY, "sounds/PHfootstep2.wav", 1, 1.75); 96 self.lastsound_time = time - 0.15; 97 } 98 99 //footsteps 100 if((vlen(self.velocity) > 315) &&( time - self.lastsound_time > 0.3) && (self.flags & FL_ONGROUND)) 101 { 102 local float movelen = vlen(input_movevalues); 103 if(movelen > 300) 104 { 105 local float ran = random(); 106 if(ran > 0.5) 107 sound(self, CHAN_BODY, "sounds/PHfootstep1.wav", 0.01, 2.5); 108 else 109 sound(self, CHAN_BODY, "sounds/PHfootstep1.wav", 0.01, 2.5); 110 self.lastsound_time = time; 111 } 112 } 113 114 self.oldvelocity = self.velocity; 115 }; 116 117 void() ClientKill = 118 { 119 }; 120 121 //called when a client connects to the server 122 void(optional float csqcactive) ClientConnect = 123 { 124 bprint(PRINT_HIGH, self.netname); //print player name 125 bprint(PRINT_HIGH, " connected.\n"); 126 127 if (!world.strack) 128 return; 129 130 //TODO: Make it so you don't need to add 131 //"sound/.." to the beginning of the 132 //strack string 133 sound(self, CHAN_AUTO, world.strack, 0.4, ATTN_NONE); 134 }; 135 136 void(entity attacker, float damage) PlayerPain = 137 { 138 local float rs; 139 140 if (damage > 40) 141 { 142 sound (self, CHAN_VOICE, "sounds/hurtbad.wav", 1, ATTN_NORM); 143 } 144 else 145 { 146 rs = rint((random() * 2) + 1); 147 148 if (rs == 1) 149 sound (self, CHAN_VOICE, "sounds/ouch.wav", 1, ATTN_NORM); 150 else 151 sound (self, CHAN_VOICE, "sounds/ouch2.wav", 1, ATTN_NORM); 152 } 153 } 154 155 void() PlayerDie = 156 { 157 // self.view_ofs = '0 0 -8'; 158 // self.deadflag = DEAD_DYING; 159 self.solid = SOLID_NOT; 160 self.flags = self.flags - (self.flags & FL_ONGROUND); 161 self.movetype = MOVETYPE_TOSS; 162 sound(self, CHAN_VOICE, "sounds/death.wav", 1, ATTN_NONE); 163 164 WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); 165 WriteByte(MSG_MULTICAST, EVENT_PLAYERDEATH); 166 multicast(self.origin, MULTICAST_ONE); 167 168 self.nextthink = -1; 169 // self.deadflag = DEAD_DEAD; 170 // bprint(PRINT_HIGH, "PlayerDie called\n"); 171 } 172 173 void() PlayerSpawn = 174 { 175 local entity spawnpoint; 176 spawnpoint = find(world, classname, "info_player_start"); 177 178 self.isspec = FALSE; 179 self.classname = "player"; 180 self.solid = SOLID_SLIDEBOX; 181 setmodel(self, "models/pmodel.iqm"); 182 self.movetype = MOVETYPE_WALK; 183 self.health = 100; 184 self.takedamage = DAMAGE_AIM; 185 self.origin = spawnpoint.origin + [0,0,1]; 186 self.fixangle = TRUE; 187 setsize(self, [-16, -16, -24], [16, 16, 32]); 188 // self.view_ofs = '0 0 22'; 189 self.ammo_pistol = 50; 190 self.items = IT_PISTOL; 191 self.ready = 0; 192 self.readystate = READY; 193 self.mapend = 0; 194 SwitchWeapon(IT_PISTOL); 195 stuffcmd(self, "cl_gunx 8;cl_guny 16;cl_gunz 25\n"); 196 197 // self.attack_finished = time; 198 self.th_die = PlayerDie; 199 self.th_pain = PlayerPain; 200 self.deadflag = DEAD_NO; 201 }; 202 203 void() SpectatorSpawn = 204 { 205 local entity spawnpoint; 206 spawnpoint = find(world, classname, "info_player_start"); 207 208 self.isspec = TRUE; 209 self.classname = "spectator"; 210 self.solid = SOLID_NOT; 211 setmodel(self, ""); 212 self.movetype = MOVETYPE_FLY; 213 self.origin = spawnpoint.origin + [0,0,1]; 214 self.fixangle = TRUE; 215 setsize(self, [-16, -16, -24], [16, 16, 32]); 216 self.view_ofs = '0 0 22'; 217 self.aiment = world; 218 }; 219 220 //called when a client loads a map 221 void() PutClientInServer = 222 { 223 stuffcmd(self, "promptjoin\n"); 224 SpectatorSpawn(); 225 }; 226 227 //called when client disconnects from the server 228 void() ClientDisconnect = 229 { 230 bprint(PRINT_HIGH, self.netname); 231 bprint(PRINT_HIGH, " has left the game.\n"); 232 remove(self); 233 }; 234 235 236 void() SetNewParms = 237 { 238 }; 239 240 void() SetChangeParms = 241 { 242 }; 243 244 void() info_player_start = 245 { 246 247 }; 248 249 void(string com) SV_ParseClientCommand = 250 { 251 if(com == "joingame") 252 { 253 if(self.isspec) 254 { 255 bprint(PRINT_HIGH, self.netname); 256 bprint(PRINT_HIGH, " has joined the game.\n"); 257 PlayerSpawn(); 258 } 259 else 260 sprint(self, PRINT_HIGH, "You're already in game!\n"); 261 } 262 else if(com == "specgame") 263 { 264 if(self.isspec) 265 return; 266 else 267 { 268 SpectatorSpawn(); 269 bprint(PRINT_HIGH, self.netname); //print player name 270 bprint(PRINT_HIGH, " has joined the spectators.\n"); 271 } 272 } 273 }; 274 275 void() SV_RunClientCommand = 276 { 277 runstandardplayerphysics(self); 278 }