| 1217 | bool grenades::busy() { return state!=GST_NONE; } |
| 1218 | |
| 1219 | bool grenades::attack(vec &targ) |
| 1220 | { |
| 1221 | int attackmillis = lastmillis-owner->lastaction; |
| 1222 | vec &vel = targ; |
| 1223 | |
| 1224 | bool waitdone = attackmillis>=gunwait && !(m_arena && m_teammode && arenaintermission); |
| 1225 | if(waitdone) gunwait = reloading = 0; |
| 1226 | |
| 1227 | switch(state) |
| 1228 | { |
| 1229 | case GST_NONE: |
| 1230 | if(waitdone && owner->attacking && this==owner->weaponsel) |
| 1231 | { |
| 1232 | attackevent(owner, type); |
| 1233 | activatenade(vel); |
| 1234 | } |
| 1235 | break; |
| 1236 | |
| 1237 | case GST_INHAND: |
| 1238 | if(waitdone) |
| 1239 | { |
| 1240 | if(!owner->attacking || this!=owner->weaponsel) thrownade(); |
| 1241 | else if(!inhandnade->isalive(lastmillis)) dropnade(); |
| 1242 | } |
| 1243 | break; |
| 1244 | |
| 1245 | case GST_THROWING: |
| 1246 | if(attackmillis >= throwwait) |
| 1247 | { |
| 1248 | reset(); |
| 1249 | if(!mag && this==owner->weaponsel) |
| 1250 | { |
| 1251 | owner->weaponchanging = lastmillis-1-(weaponchangetime/2); |
| 1252 | owner->nextweaponsel = owner->weaponsel = owner->primweap; |
| 1253 | } |
| 1254 | return false; |
| 1255 | } |
| 1256 | break; |
| 1257 | } |
| 1258 | return true; |
| 1259 | } |
| 1260 | |
| 1261 | void grenades::attackfx(const vec &from, const vec &vel, int millis) // other player's grenades |
| 1262 | { |
no test coverage detected